您的位置:首页 > 其它

hiho一下 第九十八周

2016-05-17 19:24 471 查看
Problem: 搜索一·24点

Description: 经典的24点游戏

Solution: 枚举搜索,运算符共有4种,四个数字的排列方式有4!种。枚举排列,同时通过DFS枚举三个位置上的运算符情况,最后枚举括号的情况,括号的情况有5种。通过这样的暴力枚举,一旦我们找到了24点的情况我们就停止枚举。

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: