您的位置:首页 > 其它

24点游戏

2017-10-25 20:40 190 查看
以下的这一篇文章不考虑精度的。。

考虑精度的需要列出所有的情况搜索。。没有写。。

问你是否通过加减乘除括号构成24点。

第一行t,表示有多少组测试数据,1<=t<=50

接下来t行,每行4个数字,表示每个数都是多少,1<=a[i]<=13

Output

对于每一次询问,如果能够凑成24点,输出yes,否则输出no

Sample Input

2

3 3 8 8

1 1 1 1

Sample Output

yes

no

难点只是如何任意取两个数

两个for循环任取就好

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace::std;
double num[5];
const double epx=1e-11;
int flag=0;
void dfs(int s,double sum)
{
if(flag==1)
{
return;
}
if(s==1)
{
if(fabs(sum-24)<epx)
{
flag=1;
return ;
}
}
for(int i=1;i<=s;i++)
{
for(int j=1;j<=s;j++)
{
if(i==j)
continue;
int a,b;
a=num[i];
b=num[j];
num[j]=num[s];
num[i]=a+b;
dfs(s-1,num[i]);
num[i]=a-b;
dfs(s-1,num[i]);
num[i]=a*b;
dfs(s-1,num[i]);
if(b!=0)
{
num[i]=a/b;
dfs(s-1,num[i]);
}
num[i]=a;
num[j]=b;
}
}
}
int main ()
{
int t;
cin>>t;
while(t--)
{
flag=0;
for(int i=1;i<=4;i++)
{
cin>>num[i];
}
dfs(4,0);
if(flag)
{
puts("yes");
}
else
{
puts("no");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: