CDOJ 24点游戏

来源:互联网 发布:单片机与接口技术 编辑:程序博客网 时间:2024/06/04 18:55

题目连接

http://acm.uestc.edu.cn/#/problem/show/1252

Description

24点就是给你一串数字,问你是否通过加减乘除括号构成24点。
沈爷觉得这个很好玩,就决定考考你,给你4个数,可以交换位置,可以用加减乘除和括号,是否能构成24点呢?
注意哦~这里的除法并不是整数除法,比如样例

Input

第一行T,表示有多少组测试数据,1≤T≤50接下来T行,每行4个正整数a1, a2, a3, a4,表示每个数都是多少,1≤ai≤13

Output

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

Sample Input

2
3 3 8 8
1 1 1 1

Sample Output

yes
no

Hint

题意

用尽4个数,可以出现分数,可以加括号,能否凑出24点

题解

优先深度搜索,要搜索所有的情况,x1-x2与x2-x1,x1/x2与x2/x1都是两种情况,x1*x2,x1+x2只有一种情况

代码

#include<bits/stdc++.h>using namespace std;#define max 1000typedef pair<int,int>p;#define INF  1e9+7#define ll long long#define eps 1e-6queue<double> que;int num[5];//double tot=0;bool dfs(int n){    if (n==1)    {   if (fabs(24-num[0])<eps)//精度足够小 就可以达到24的要求        {         return true;        }        else{            return false;        }      }    for (int i = 0; i < n; ++i)    {   int i1=num[i];        int i2=num[i+1];        for (int j = i+1; j <n ; ++j)        {            num[j]=num[n-1]; //减小搜索的数组大小             num[i]=i1+i2;if(dfs(n-1))return 1;//更新num[i]作为此次搜索的新数据             num[i]=i1*i2;if(dfs(n-1))return 1;             num[i]=i1-i2;if(dfs(n-1))return 1;             num[i]=i2-i1;if(dfs(n-1))return 1;             if (i1)// i1不为0 0不能作为分母             {                 num[i]=i2/i1;if(dfs(n-1))return 1;             }             if (i2)             {                 num[i]=i1/i2;if(dfs(n-1))return 1;             }             num[i]=i1;// 此次num[i]搜索没有找到和为24,把num[i] num[j]的值还原,重新开始搜索             num[j]=i2; //        }    } return 0;}int main(int argc, char const *argv[]){    int t;    cin>>t;    for (int i = 0; i < t; ++i)    {        cin>>num[0]>>num[1]>>num[2]>>num[3];        if (dfs(4))        {            printf("yes\n");        }        else{            printf("no\n");        }    }    return 0;}

Get

0 0
原创粉丝点击