题目大意
解题思路
(1) 由于有括号,因此我们可以不考虑运算符之间的优先级。
(2) 以现有数字的两两组合
和不同运算
为分支进行深搜,每次组合后减少一个数字,用0
占位,数字0不再参与组合。
(3) 递归出口,两两组合,直到最终组合到一个数字。
代码
#include<iostream>
using namespace std;
int flag;
double abs(double a)
{
if(a > 0)
return a;
return -a;
}
void dfs(double a, double b, double c, double d)
{
if(flag)
return;
if(abs(a+b+c+d-24.0) < 10e-4)
{
flag = 1;
return;
}
double arr[4] = {a, b, c, d};
for(int i=0; i<4; i++)
{
for(int j=0; j<4; j++)
{
double brr[4];
if(i!=j && arr[i] != 0 && arr[j] != 0)
{
double tmp1 = arr[i]+arr[j];
for(int t=0; t<4; t++)
brr[t] = arr[t];
brr[i] = tmp1;
brr[j] = 0;
dfs(brr[0], brr[1], brr[2], brr[3]);
tmp1 = arr[i]-arr[j];
for(int t=0; t<4; t++)
brr[t] = arr[t];
brr[i] = tmp1;
brr[j] = 0;
dfs(brr[0], brr[1], brr[2], brr[3]);
tmp1 = arr[i]*arr[j];
for(int t=0; t<4; t++)
brr[t] = arr[t];
brr[i] = tmp1;
brr[j] = 0;
dfs(brr[0], brr[1], brr[2], brr[3]);
tmp1 = arr[i]/arr[j];
for(int t=0; t<4; t++)
brr[t] = arr[t];
brr[i] = tmp1;
brr[j] = 0;
dfs(brr[0], brr[1], brr[2], brr[3]);
}
}
}
}
int main()
{
double a, b, c, d;
while(cin >> a >> b >> c >> d && a)
{
flag = 0;
dfs(a, b, c, d);
if(flag)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}
知识点
- 声明在函数内部的数组是每个函数独有的,如上方的
arr[4]
dfs(int x, int y)
通过dfs(b[0], b[1])
调用不会改变b[0]
、b[1]
的值。