Time Limit: 1000MS | Memory Limit: 65535KB | 64bit IO Format: %lld & %llu |
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
3 3 8 8
就可以构造出 8÷(3–8÷3)=24
Source
#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;
}