题目描述
速算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
Code
答案错误75%
不知道该怎么做,这样一一枚举很难枚举全啊
#include<stdio.h>
#include<string.h>
int fun3(int a, int b, int c, int d)
{//进行运算
if(a+b+c+d==24) return 1;
if(a*b*c*d==24) return 1;
if(a*b*c+d==24) return 1;
if(a*b+c+d==24) return 1;
if((a+b+c)==24*d) return 1;
if((a*b+c)==24*d) return 1;
if((a*b*c)==24*d) return 1;
if(a*b*c-d==24) return 1;
if((a*b+c)-d==24) return 1;
if(a+b+c-d==24) return 1;
if(a*b-c-d==24) return 1;
if(a*b+c-d==24) return 1;
if(a*b*(c-d)==24) return 1;
return 0;
}
int fun2(int a,int b,int c,int d)
{//进行二次排列
if(fun3(a,b,c,d)) return 1;
if(fun3(a,b,d,c)) return 1;
if(fun3(a,c,b,d)) return 1;
if(fun3(a,c,d,b)) return 1;
if(fun3(a,d,b,c)) return 1;
if(fun3(a,d,c,b)) return 1;
return 0;
}
int fun1(int a,int b,int c,int d)
{//进行一次排列
if(fun2(a,b,c,d)) return 1;
if(fun2(b,a,c,d)) return 1;
if(fun2(c,a,b,d)) return 1;
if(fun2(d,a,b,c)) return 1;
return 0;
}
int main()
{
char st[12];
int a[5]={0},i,j;
while(gets(st)){
for(i=j=0;st[i]!='\0';i++){
if(st[i]==' ');
else if(st[i]=='1'&&st[i+1!='\0'&&st[i+1]=='0'){
a[j++]=10;
i++;
}
else if(st[i]>='2'&&st[i]<='9') a[j++]=st[i]-'0';
else if(st[i]=='A') a[j++]=1;
else if(st[i]=='J') a[j++]=11;
else if(st[i]=='Q') a[j++]=12;
else if(st[i]=='K') a[j++]=13;
}
if(fun1(a[0],a[1],a[2],a[3])) printf("Y\n");
else printf("N\n");
}
return 0;
}