24点游戏dfs求解

24点游戏ios

Time Limit: 1000MS   Memory Limit: 65535KB   64bit IO Format: %lld & %llu

 Status测试

Descriptionui

 24点就是给你一串数字,问你是否经过加减乘除括号构成 24点。spa

沈爷以为这个很好玩,就决定考考你,给你 4个数,能够交换位置,能够用加减乘除和括号,是否能构成 24点呢?.net

注意哦~这里的除法并非整数除法,好比样例code

Inputorm

第一行 T,表示有多少组测试数据, 1≤T≤50blog

接下来 T行,每行 4个正整数   a1,    a2,    a3,    a4,表示每一个数都是多少,   1≤ai≤13游戏

Outputip

对于每一次询问,若是可以凑成 24点,输出yes,不然输出no

Sample Input


3 3 8 8 
1 1 1 1

Sample Output

yes 
no

Hint

    8

就能够构造出 - 

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
double num[10];
bool flag;
bool dfs(int x)
{
    if(x==1)
    {
        if(fabs(num[0]-24)<1e-2)
        return true;
        else 
        return false;
    }
    double a,b;
    for(int i=0;i<x;i++)
    {
        for(int j=i+1;j<x;j++)
        {
            a=num[i];
            b=num[j];
            num[j]=num[x-1];//x表示运算的次数,也用来肯定区间,
            //每次x-1,同时区间缩小,num[0]做为运算的结果 ,其实就是覆盖计算过的数,后面的数向前移动一个位置。
            num[i]=a+b;if(dfs(x-1)) return true;
            num[i]=a-b;if(dfs(x-1)) return true;
            num[i]=b-a;if(dfs(x-1)) return true;
            num[i]=a*b;if(dfs(x-1)) return true;
            if(b!=0) num[i]=a/b;if(dfs(x-1)) return true;//除法分母不为0 
            if(a!=0) num[i]=b/a;if(dfs(x-1)) return true;
            num[i]=a;//回溯 
            num[j]=b;
        }
    }
    return false;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        flag=false;
        for(int i=0;i<4;i++)
        cin>>num[i];
        if(dfs(4))
        cout<<"yes"<<endl;
        else 
        cout<<"no"<<endl;
    }
    return 0;
}
相关文章
相关标签/搜索