Description
游戏规则:给出4个1-10的数字,通过加减乘除,得到数字为24就算胜利。 程序目的:判断给出的4个数字是否可以凑成24,并输出判断结果。
Input
4个1-10的数字。[数字允许重复,测试用例保证无异常数字]
Output
如能凑成24,输出YES,反之则输出NOT
Sample Input
7 2 1 10
1 1 1 1
3 3 3 3
Sample Output
YES
NOT
YES
主要思路:
先排序,再全排列,然后使用递归考虑所有的加、减、乘、除操作;
代码如下:
#include<iostream>
#include <string>
#include<algorithm>
#define N 4
using namespace std;
int flag;
int num[N];
void solveByDfs(int index,int result,int num[])
{
if(result==24 && index==4)
{
flag=1;
return;
}
if(index>=4)
return ;
for(int choose=0; choose<4; choose++)
{
switch(choose)
{
case 0:
solveByDfs(index+1,result+num[index],num);
break;
case 1:
solveByDfs(index+1,result-num[index],num);
break;
case 2:
solveByDfs(index+1,result*num[index],num);
break;
case 3:
solveByDfs(index+1,result/num[index],num);
break;
}
if(flag)
return;
}
}
int main()
{
int test;
while(cin>>num[0]>>num[1]>>num[2]>>num[3])
{
flag=0;
test=0;
sort(num,num+4);//排序
do
{
solveByDfs(0,test,num);
}
while(next_permutation(num,num+4)); //全排列函数,每次返回下一个全排列
if(flag)
cout<<"YES"<<endl;
else
cout<<"NOT"<<endl;
}
return 0;
}