Problem Description
速算24点相信绝大多数人都玩过。就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用'+','-','*','/'运算符以及括号改变运算顺序,使得最终运算结果为24(每个数必须且仅能用一次)。游戏很简单,但遇到无解的情况往往让人很郁闷。你的任务就是针对每一组随机产生的四张牌,判断是否有解。我们另外规定,整个计算过程中都不能出现小数。
Input
每组输入数据占一行,给定四张牌。
Output
每一组输入数据对应一行输出。如果有解则输出"Yes",无解则输出"No"。
Sample Input
A 2 3 6
3 3 8 8
Sample Output
Yes
No
之前的搜索都是地图问题,猛地拿来这个题一惊!!!
其实就是炒鸡暴力枚举 就是要注意一下减和除的顺序不能颠倒,还有就是除数不能为0的情况
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
double num[4];
int dfs(int n){
for(int i=0;i<4;i++)//因为不能出现小数
if(num[i]!=(int)num[i])
return 0;
if(n==1){
//if(fabs(num[0]-24)<0.00001)
if(num[0]==24)
return 1;
else
return 0;
}
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++){//任意选两个数进行 + - * / 被减,被除
double a=num[i],b=num[j];
num[j]=num[n-1];//
//下标 0,1运算放到0 1换成2
//下一轮继续 直到头 即结果放在num[0]
num[i]=a+b; if(dfs(n-1)) return 1;
num[i]=a*b; if(dfs(n-1)) return 1;
num[i]=a-b; if(dfs(n-1)) return 1;
num[i]=b-a; if(dfs(n-1)) return 1;
//注意!!!除数不能为0!!!
if(b){
num[i]=a/b;
if(dfs(n-1)) return 1;
}
if(a){
num[i]=b/a;
if(dfs(n-1)) return 1;
}
num[i]=a;
num[j]=b;//数值恢复
}
return 0;
}
int main(){
char mmp[4][3];
char a[14][3]={"0","A","2","3","4","5","6","7","8","9","10","J","Q","K"};
while(scanf("%s%s%s%s",mmp[0],mmp[1],mmp[2],mmp[3])!=EOF){
for(int i=0;i<4;i++){//把牌转换成对应的数字
for(int j=1;j<=13;j++)
if(strcmp(mmp[i],a[j])==0){
num[i]=j;//对应数字
break;
}
//printf("%lf ",num[i]);
}
if(dfs(4))
printf("Yes\n");
else
printf("No\n");
memset(mmp,0,sizeof(mmp));
memset(num,0,sizeof(num));
}
return 0;
}