简介
使用回溯 + 暴力
code
#include <iostream>
#include <string>
#include <map>
#include <vector>
using namespace std;
bool flag = false;
char v[4]={'+', '-', '*', '/'};
string mm[14] = {"0", "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
int calc(char x, int a, int b){
switch(x){
case '+': return a+b;
case '-': return a-b;
case '*': return a*b;
case '/': return b == 0 ? 1111111 : a/b;
}
}
bool check(vector<int> &path){
for(int j=0; j<4; j++){
int ee = calc(v[j], path[0], path[1]);
if(ee == 1111111) continue;
for(int k=0; k<4; k++) {
int ff = calc(v[k], ee, path[2]);
if(ff == 1111111) continue;
for(int l=0; l<4; l++){
int gg = calc(v[l], ff, path[3]);
if(gg == 1111111) continue;
if(gg == 24) {
cout << mm[path[0]] << v[j] << mm[path[1]] << v[k] << mm[path[2]] << v[l] <<
mm[path[3]] << endl;
return true;
}
}
}
}
return false;
}
void dfs(vector<int> &v, map<int, bool> &vis, vector<int> &path){
if(path.size() == v.size()) {
flag = check(path);
return;
}
for(int i=0; i<4; i++){
if(flag) {
return;
}
if(vis[i] == false) {
vis[i] = true;
path.push_back(v[i]);
dfs(v, vis, path);
if(flag) {
return;
}
path.pop_back();
vis[i] = false;
}
}
}
int main() {
string a, b, c, d;
map<string, int> m;
m["2"] = 2;
m["3"] = 3;
m["4"] = 4;
m["5"] = 5;
m["6"] = 6;
m["7"] = 7;
m["8"] = 8;
m["9"] = 9;
m["10"] = 10;
m["A"] = 1;
m["J"] = 11;
m["Q"] = 12;
m["K"] = 13;
int aa, bb, cc, dd;
while(cin >> a >> b >> c >> d) {
if(a == "joker" || b == "joker" || c == "joker" || d=="joker") {
cout << "ERROR\n";
continue;
}
vector<int> vv(4);
vv[0] = m[a];
vv[1] = m[b];
vv[2] = m[c];
vv[3] = m[d];
map<int, bool> vis;
vector<int> path;
dfs(vv, vis, path);
if(!flag) cout << "NONE\n";
}
}
---------------------------我的天空里没有太阳,总是黑夜,但并不暗,因为有东西代替了太阳。虽然没有太阳那么明亮,但对我来说已经足够。凭借着这份光,我便能把黑夜当成白天。我从来就没有太阳,所以不怕失去。
--------《白夜行》