Problem: 搜索一·24点
Description: 经典的24点游戏
Solution: 枚举搜索,运算符共有
4
种,四个数字的排列方式有
Code(C++):
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
const int M=4;
const int EPS=1e-10;
const char oper[]="+-*/";
double a[M];
char p[M];
bool flag;
double add(double x,double y,int index)
{
switch(p[index]){
case '+':
return x+y;
case '-':
return x-y;
case '*':
return x*y;
case '/':
return x/y;
}
}
bool cal()
{
bool f0=(24==add(add(add(a[0],a[1],0),a[2],1),a[3],2));
bool f1=(24==add(add(a[0],a[1],0),add(a[2],a[3],2),1));
bool f2=(24==add(a[0],add(add(a[1],a[2],1),a[3],2),0));
bool f3=(24==add(a[0],add(a[1],add(a[2],a[3],2),1),0));
bool f4=(24==add(add(a[0],add(a[1],a[2],1),0),a[3],2));
return f0||f1||f2||f3||f4;
}
void dfs(int x)
{
if(x==3){
if(cal())
flag=true;
return ;
}
if(flag)
return ;
for(int i=0;i<4;i++){
p[x]=oper[i];
dfs(x+1);
if(flag)
return ;
}
}
int main()
{
int N;
for(scanf("%d",&N);N--;){
for(int i=0;i<M;i++)
scanf("%lfd",&a[i]);
flag=false;
sort(a,a+4);
do{
dfs(0);
if(flag)
break;
}while(next_permutation(a,a+4));
puts(flag? "Yes":"No");
}
return 0;
}