题目连接
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 1000
typedef pair<int,int>p;
#define INF 1e9+7
#define ll long long
#define eps 1e-6
queue<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;
}