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;
}
相關文章
相關標籤/搜索