题目:
一副扑克牌的每张牌表示一个数(J、Q、K 分别表示 11、12、13,两个司令都表示 6)。任取4 张牌,即得到 4 个 1~13 的数,请添加运算符(规定为加+ 减- 乘* 除/ 四种)使之成为一个运算式。每个数只能参与一次运算,4 个数顺序可以任意组合,4 个运算符任意取 3 个且可以重复取。运算遵从一定优先级别,可加括号控制,最终使运算结果为 24。请输出一种解决方案的表达式,用括号表示运算优先。如果没有一种解决方案,则输出 -1 表示无解。
输入格式:
输入在一行中给出 4 个整数,每个整数取值在 [1, 13]。
输出格式:
输出任一种解决方案的表达式,用括号表示运算优先。如果没有解决方案,请输出 -1。
输入样例:
2 3 12 12
输出样例:
((3-2)*12)+12
使用枚举法暴力解题:
#include<stdio.h>
double ji(double a,double b,char fu){
switch(fu){
case '+':return a+b;
case '-':return a-b;
case '*':return a*b;
case '/':return a/b;
}
}
double cacu(double a,double b,double c,double d){
char e,f,g,m[5]="+-*/";
int t=0,i,j,k;
for(i=0;i<4;i++){
e=m[i];
for(j=0;j<4;j++){
f=m[j];
for(k=0;k<4;k++){
g=m[k];
if(ji(ji(ji(a,b,e),c,f),d,g)==24){
printf("((%.0f%c%.0f)%c%.0f)%c%.0f",a,e,b,f,c,g,d);
return 1;
}
if(ji(ji(a,ji(b,c,f),e),d,g)==24){
printf("(%.0f%c(%.0f%c%.0f))%c%.0f",a,e,b,f,c,g,d);
return 1;
}
if(ji(ji(a,b,e),ji(c,d,g),f)==24){
printf("(%.0f%c%.0f)%c(%.0f%c%.0f)",a,e,b,f,c,g,d);
return 1;
}
if(ji(a,ji(ji(b,c,f),d,g),e)==24){
printf("%.0f%c((%.0f%c%.0f)%c%.0f)",a,e,b,f,c,g,d);
return 1;
}
if(ji(a,ji(b,ji(c,d,g),f),e)==24){
printf("%.0f%c(%.0f%c(%.0f%c%.0f))",a,e,b,f,c,g,d);
return 1;
}
}
}
}
return 0;
}//64种符号*5种括号排列
int main(){
int m[4],i,j,k,l,a,b,c,d,t=0;
for(i=0;i<4;i++){
scanf("%d",&m[i]);
}
for(i=0;i<4;i++){
a=m[i];
for(j=0;j<4;j++){
if(j==i)continue;
b=m[j];
for(k=0;k<4;k++){
if(k==i||k==j)continue;
c=m[k];
for(l=0;l<4;l++){
if(l==i||l==j||l==k)continue;
d=m[l];
if(cacu(a,b,c,d)){
t=1;//有方案
goto E;
}
}
}
}
}//全排列4*3*2*1=24种
E: if(t==0){
printf("-1");
}
return 0;
}