hiho一下 第九十八周 题目1 : 搜索一·24点
原创
©著作权归作者所有:来自51CTO博客作者scx_white的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目1 : 搜索一·24点
时间限制: 10000ms
单点时限: 1000ms
内存限制: 256MB
描述
周末,小Hi和小Ho都在家待着。
在收拾完房间时,小Ho偶然发现了一副扑克,于是两人考虑用这副扑克来打发时间。
小Ho:玩点什么好呢?
小Hi:两个人啊,不如来玩24点怎么样,不靠运气就靠实力的游戏。
小Ho:好啊,好啊。
<经过若干局游戏之后>
小Ho:小Hi,你说如果要写个程序来玩24点会不会很复杂啊?
小Hi:让我想想。
<过了几分钟>
小Hi:我知道了!其实很简单嘛。
提示:24点
输入
第1行:1个正整数, t,表示数据组数,2≤t≤100。
第2..t+1行:4个正整数, a,b,c,d,1≤a,b,c,d≤10。
输出
第1..t行:每行一个字符串,第i行表示第i组能否计算出24点。若能够输出"Yes",否则输出"No"。
样例输入
样例输出
搜索 遍历所有可能的情况就可以了。。。
#include <stdio.h>
#include <math.h>
double num[4];
bool dfs(int n)
{
if(n==1)
{
//n=1时 最终的结果保存在num[0]
if(fabs(num[0]-24)<0.000001)
return true;
else
return false;
}
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
double x=num[i];
double y=num[j];
//已经使用过的数 使它等于最后一个数
num[j]=num[n-1];
num[i]=x+y;if(dfs(n-1)) return true;
num[i]=x-y;if(dfs(n-1)) return true;
num[i]=y-x;if(dfs(n-1)) return true;
num[i]=x*y;if(dfs(n-1)) return true;
//避免除0
if(y)
{
num[i]=x/y;
if(dfs(n-1)) return true;
}
//避免除0
if(x)
{
num[i]=y/x;
if(dfs(n-1)) return true;
}
//回溯
num[i]=x;
num[j]=y;
}
}
return false;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
scanf("%lf %lf %lf %lf",&num[0],&num[1],&num[2],&num[3]);
if(dfs(4))
puts("Yes");
else
puts("No");
}
return 0;
}