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;
}
上一题
下一题