24点游戏

来源:互联网 发布:淘宝衣服换号 编辑:程序博客网 时间:2024/06/04 17:50

以下的这一篇文章不考虑精度的。。
考虑精度的需要列出所有的情况搜索。。没有写。。

问你是否通过加减乘除括号构成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");        }    }}
原创粉丝点击