题目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"。

样例输入
2
5 5 5 1
9 9 9 9
样例输出
Yes
No
思路:简单的dfs,但是要用浮点;
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define inf 999999999
#define esp 0.00000000001
//#pragma comment(linker, "/STACK:102400000,102400000")
int scan()
{
    int res = 0 , ch ;
    while( !( ( ch = getchar() ) >= '0' && ch <= '9' ) )
    {
        if( ch == EOF ) return 1 << 30 ;
    }
    res = ch - '0' ;
    while( ( ch = getchar() ) >= '0' && ch <= '9' )
        res = res * 10 + ( ch - '0' ) ;
    return res ;
}
double a[5],ans;
void dfs(double num,double gg,int step)
{
    if(step==4)
    {
        if(num==24)
        ans=1;
        return;
    }
    //不加括号
    dfs(num+gg,a[step+1],step+1);
    dfs(num-gg,a[step+1],step+1);
    dfs(num*gg,a[step+1],step+1);
    if(gg!=0)
    dfs(num/gg,a[step+1],step+1);
    //加括号
    if(step!=3)
    {
        dfs(num,gg+a[step+1],step+1);
        dfs(num,gg*a[step+1],step+1);
        dfs(num,gg-a[step+1],step+1);
        if(a[step+1]!=0)
        dfs(num,gg/a[step+1],step+1);
    }
}
int main()
{
    int x,y,z,i,t;
    scanf("%d",&x);
    while(x--)
    {
        ans=0;
        for(i=0;i<4;i++)
        scanf("%lf",&a[i]);
        sort(a,a+4);
        do
        {
            dfs(a[0],a[1],1);
        }
        while(next_permutation(a,a+4));
        if(ans)
        printf("Yes\n");
        else
        printf("No\n");
    }
    return 0;
}