测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A50519. 速算24点

填空题 困难

题目描述

速算24点

题目描述

速算24点相信绝大多数人都玩过。就是随机给你四张牌,包括 A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用'+','-','*','/'运算符以及括号改变运算 顺序,使得最终运算结果为24(每个数必须且仅能用一次)。游戏很简单,但遇到无解的情况往往让人很郁闷。你的任务就是针对每一组随机产生的四张牌,判断 是否有解。我们另外规定,整个计算过程中都不能出现小数。

输入

输入数据占一行,给定四张牌。

输出

如果有解则输出"Y",无解则输出"N"。

样例输入

A 2 3 6

样例输出

Y

参考答案

#include <iostream> using namespace std; //计算两个数的+,-,*,/ int sign(int a,int b,int i) { if(i==0)return a+b; if(i==1)return a-b; if(i==2)return a*b; if(i==3&&b!=0&&a%b==0)return a/b; else return -1; } //递归,每次两个数运算 bool tf(int *a,int n) { if(n==1) { if(a[0]==24)return true; else return false; } else { bool flag=false; int *b;//用来装下一组 b=new int [n-1]; for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) { //分别四种运算 for(int q=0;q<4;q++) { if(a[i]<a[j])b[0]=sign(a[j],a[i],q); else b[0]=sign(a[i],a[j],q); if(b[0]==-1)continue;//不能除,下一组 int k=1; for(int p=0;p<n;p++)if(p!=i&&p!=j)b[k++]=a[p];//其它数装进来 if(tf(b,n-1))flag=true; if(flag)break;//找到退出 } if(flag)break; } if(flag)break; } delete [] b; return flag; } } int main() { char s[12]; cin.getline(s,12); int a[4]={0},k=0; for(int i=0;s[i]!='\0';i++) { if(s[i]==' ')continue; else if(s[i]>='2'&&s[i]<='9')a[k++]=s[i]-'0'; else if(s[i]=='A')a[k++]=1; else if(s[i]=='J')a[k++]=11; else if(s[i]=='Q')a[k++]=12; else if(s[i]=='K')a[k++]=13; else if(s[i]=='1'&&(s[i+1]=='\0'||s[i+1]==' '))a[k++]=1; else if(s[i]=='1'&&s[i+1]=='0'){a[k++]=10;i++;} } if(tf(a,4))cout<<"Y"<<endl; else cout<<"N"<<endl; return 0; }
上一题 下一题