您的位置:首页 > 其它

24点游戏

2013-04-18 12:03 274 查看

描述

几十年前全世界就流行一种数字扑克游戏,至今仍有人乐此不疲.在中国我们把这种游戏称为“算24点”。您作为游戏者将得到4个1-13(在扑克牌里用A代替1,J代替11,Q代替12,K代替13)之间的自然数作为操作数,而您的任务是对这4个操作数进行适当的算术运算,判断运算结果是否等于24。能输出1,不能输出0。

格式

输入格式

四个牌面值。牌面值与牌面值之间用一个空格隔开。

输出格式

输出0或1。

样例1

样例输入1[复制]


3 8 10 Q


样例输出1[复制]


1



限制

每个测试点1s

View Code

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cmath>
#define exp 1e-6
using namespace std;
int dd[5];
bool flag[5];
bool mark;
void dfs(int step,double sum)
{
if(step==4)
{
if(fabs(sum-24)<exp)
{
mark=true;
}
return;
}
if(mark)
return;
int i;
for(i=0;i<4;i++)
{
if(!flag[i])
{

flag[i]=true;
dfs(step+1,sum*dd[i]*1.0);
if(mark)
return;
dfs(step+1,sum+dd[i]*1.0);
if(mark)
return;
dfs(step+1,sum-dd[i]*1.0);
if(mark)
return;
dfs(step+1,dd[i]*1.0-sum);
if(mark)
return;
if(dd[i]!=0)
{
dfs(step+1,sum/(dd[i]*1.0));
if(mark)
return;
}
if(sum!=0)
{
dfs(step+1,(dd[i]*1.0)/sum);
if(mark)
return;
}
flag[i]=false;
}
}
}

int main()
{
char num[5][5];

while(~scanf("%s",num[0]))
{
if(num[0][0]=='2' || num[0][0]=='3' ||num[0][0]=='4' || num[0][0]=='5' || num[0][0]=='6' || num[0][0]=='7' || num[0][0]=='8' || num[0][0]=='9')
dd[0]=num[0][0]-'0';
else if(num[0][0]=='A')
dd[0]=1;
else if(num[0][0]=='J')
dd[0]=11;
else if(num[0][0]=='Q')
dd[0]=12;
else if(num[0][0]=='K')
dd[0]=13;
else
dd[0]=10;
int i;
for(i=1;i<4;i++)
{
scanf("%s",num[i]);
if(num[i][0]=='2' || num[i][0]=='3' ||num[i][0]=='4' || num[i][0]=='5' || num[i][0]=='6' || num[i][0]=='7' || num[i][0]=='8' || num[i][0]=='9')
dd[i]=num[i][0]-'0';
else if(num[i][0]=='A')
dd[i]=1;
else if(num[i][0]=='J')
dd[i]=11;
else if(num[i][0]=='Q')
dd[i]=12;
else if(num[i][0]=='K')
dd[i]=13;
else
dd[i]=10;
}
memset(flag,false,sizeof(flag));
mark=false;
for(i=0;i<4;i++)
{
flag[i]=true;
dfs(1,dd[i]*1.0);
flag[i]=false;
}
if(mark)
printf("1\n");
else
printf("0\n");
}
return 0;
}


这是一道深搜题目,首先计算所有的排列顺序,运用所有的运算符号,这样可以忽略括号带来的运算优先级的不同,值得注意的是减法和除法运算要考虑a-b和b-a两种可能,a/b 和b/a,还必须保证分母不能为0,其他的都是深搜模板了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: