原题链接
这是一道特别的爆搜题型,借用传递数组,不断枚举四个数的可能性并枚举3个符号位的可能的符号进行爆搜。
这类型的爆搜题目的主要特点是:边爆搜边缩小传递数组的容量(即边爆搜边计算),爆搜枚举数会随着递归深度增大而减小。
#include <iostream>
#include <vector>
#include <algorithm>
#include <vector>
using namespace std;
double a,b,c,d;
bool st;
void dfs(int u,vector<double> res)
{
if (res.size() == 1) {
if (res[0] == 24) st = true;
return;
}
for (int i = 0;i < res.size();i ++) {
for (int j = 0;j < res.size();j ++ ){
if (i == j) continue;
vector<double> x;
for (int k = 0;k < res.size();k ++)
if (k != i && k != j)
x.push_back(res[k]);
for (int k = 0;k < 4;k ++) {
if (k == 0) x.push_back(res[i] + res[j]);
else if (k == 1) x.push_back(res[i] - res[j]);
else if (k == 2) x.push_back(res[i] * res[j]);
else x.push_back(res[i] / res[j]);
dfs(u + 1,x);
x.pop_back();
}
}
}
}
int main()
{
while (cin >> a >> b >> c >> d) {
if (!a && !b && !c && !d) break;
st = false;
vector<double> v;
v.push_back(a),v.push_back(b),v.push_back(c),v.push_back(d);
dfs(0,v);
if (st) puts("YES");
else puts("NO");
}
return 0;
}