24点游戏
Time Limit: 20 Sec
Memory Limit: 256 MB
题目连接
http://acm.uestc.edu.cn/#/problem/show/1252
Description
24点就是给你一串数字,问你是否通过加减乘除括号构成24点。
沈爷觉得这个很好玩,就决定考考你,给你4个数,可以交换位置,可以用加减乘除和括号,是否能构成24点呢?
注意哦~这里的除法并不是整数除法,比如样例
Input
第一行T,表示有多少组测试数据,1≤T≤50
接下来T行,每行4个正整数a1, a2, a3, a4,表示每个数都是多少,1≤ai≤13
Output
对于每一次询问,如果能够凑成24点,输出yes
,否则输出no
Sample Input
2 3 3 8 8 1 1 1 1
Sample Output
yes
no
对于这题笔者是看了大牛的正解之后才知道该如何用DFS(深搜)来解决这个问题;
下面就贴出代码吧:
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;
double value[4];
//对于此处的判断是否是24点,是实数而且考虑负数
bool DFS(int n)
{
if(n==1)
{ if(fabs(value[n-1]-24)<1e-6) return true;
else return false;
}
else{
for(int i=0;i<n;++i)
for(int j=i+1;j<n;++j)
{ double x1 = value[i];
double x2 = value[j];
value[j] = value[n-1]; //将后面的数提到前面来,以便于后面的计算
value[i] = x1+x2; if(DFS(n-1)) return true;
value[i] = x1*x2; if(DFS(n-1)) return true;
value[i] = x1-x2; if(DFS(n-1)) return true;
value[i] = x2-x1; if(DFS(n-1)) return true;
if(x1){ value[i] = x2/x1; if(DFS(n-1)) return true; }
if(x2){ value[i] = x1/x2; if(DFS(n-1)) return true; }
//对于数value[j]没有满足条件,所以还原原来的数
value[i] = x1;
value[j] = x2;
}
}
//若n为数都不满足的话,就返回false
return false;
}
int main(void)
{
int T;
cin>>T;
while(T--)
{
cin>>value[0]>>value[1]>>value[2]>>value[3];
if(DFS(4)) cout<<"yes\n";
else cout<<"no\n";
}
return 0;
}
如果你还没搞清楚状况的话可以点击一下下面的传送门:
路漫漫其修远兮,吾将hold下去!
8÷(3–8÷3)