题目描述
给出4个正整数操作数,你的任务是使用运算符(+,-,*,/)和括号对操作数进行计算,分析是否能得到24,每个操作数只能使用1次,运算符和括号可以多次使用,注意所有的中间结果都必须是整数。
输入格式
输入包括多行,每行4个正整数,范围是[1,13],输入以0 0 0 0标记结束
输出格式
若输入的4个操作数能计算出24,输出Yes,否则输出No
输入样例
1 1 1 1
2 5 7 8
0 0 0 0
输出样例
No
Yes
#include<iostream>
using namespace std;
int v[4];
bool func(int n)
{
if (n == 1)
return v[0] == 24;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (i == j)
continue;
int op1 = v[i], op2 = v[j];
v[i] = op1 + op2;
v[j] = v[n - 1];
if (func(n - 1))
return 1;
v[i] = op1 - op2;
if (func(n - 1))
return 1;
v[i] = op1 * op2;
if (func(n - 1))
return 1;
if (op2 != 0 && op1 % op2 == 0)
{
v[i] = op1 / op2;
if (func(n - 1))
return 1;
}
v[i] = op1;
v[j] = op2;
}
}
return 0;
}
int main()
{
int a, b, c, d;
while (cin >> a >> b >> c >> d)
{
if (a == b && b == c && c == d && a == 0)
break;
v[0] = a;
v[1] = b;
v[2] = c;
v[3] = d;
if (func(4))
cout << "Yes"<<endl;
else cout << "No" << endl;
}
}
运用递归加回溯法,通过双层循环寻找每次的两个操作数,对两个操作数进行操作,将得到的结果存入数组中,继续深度搜索