题目描述
superwyh是一个非常疯狂的24点爱好者,空闲时总是自己拿出扑克来算24点,24点的规则很简单,就是给你4张扑克(从1至13,用A代替1,J代替11,Q代替12,K代替13)通过加减乘除来求得24,各位oier帮了superwyh好多忙,为了报答大家superwyh就和大家做个24点的游戏,superwyh给大家4张牌大家告诉superwyh能不能凑成24就行。
[renqing PS:这道题很easy,是送分的题]
输入格式
4张牌的牌面(1<=n<=13)。
输出格式
如果能凑成输出"yes"反之输出"no"。
样例输入
A 2 3 4
样例输出
yes
题解
搜索。坑爹的是要注意每个数加进算式时,可能的情况。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#define eps 1e-10
using namespace std;
int a[10],pd[10];
void init()
{
int i;
char ch[10];
for(i=0;i<4;i++)
{scanf("%s",ch);
if(ch[0]=='A') a[i]=1;
else if(ch[0]=='J') a[i]=11;
else if(ch[0]=='Q') a[i]=12;
else if(ch[0]=='K') a[i]=13;
else if(ch[0]=='1'&&ch[1]=='0') a[i]=10;
else a[i]=ch[0]-'0';
}
}
bool dfs(int usd,double sum)
{
int i;
if(usd==4)
{if(fabs(sum-24)<eps) return true;
else return false;
}
else
{for(i=0;i<4;i++)
{if(!pd[i])
{pd[i]=1;
if(dfs(usd+1,sum+a[i])) return true;
if(dfs(usd+1,sum-a[i])) return true;
if(dfs(usd+1,a[i]-sum)) return true;
if(sum!=0&&dfs(usd+1,sum*a[i])) return true;
if(sum!=0&&dfs(usd+1,sum/a[i])) return true;
if(sum!=0&&dfs(usd+1,a[i]/sum)) return true;
pd[i]=0;
}
}
return false;
}
}
int main()
{
init();
if(dfs(0,0)) printf("yes\n");
else printf("no\n");
return 0;
}