代码如下:
#include<stdio.h>
#include<string.h>
#define Inf 0xfffffff
int num[10],save[10],flag[10],ans[14][14][14][14];
char s1[3],s2[3],s3[3],s4[6];
int get(char s){
int t;
if(s=='A')
t=1;
else if(s=='J')
t=11;
else if(s=='Q')
t=12;
else if(s=='K')
t=13;
else
t=s-'0';
return t;
}
void Exchange(){
int i,k,t,j;
if(strlen(s1)==1)
save[0]=get(s1[0]);
else
save[0]=10;
if(strlen(s2)==1)
save[1]=get(s2[0]);
else
save[1]=10;
if(strlen(s3)==1)
save[2]=get(s3[0]);
else
save[2]=10;
if(strlen(s4)==1)
save[3]=get(s4[0]);
else
save[3]=10;
for(i=0;i<3;i++){
k=i;
for(j=i+1;j<4;j++)
if(save[j]<save[k])
k=j;
if(k!=i){
t=save[i];
save[i]=save[k];
save[k]=t;
}
}
}
int Ba(int x,int s,int y){
int t;
switch(s){
case 0:t=x+y;break;
case 1:t=x-y;break;
case 2:t=x*y;break;
case 3:if(y!=0 &&
x%y==0)t=x/y;
}
return t;
}
int one(int a,int b,int c){
int Result1,Result2,Result;
Result1=Ba(num[0],a,num[1]);
if(Result1==Inf)
return 0;
Result2=Ba(num[2],b,num[3]);
if(Result2==Inf)
return 0;
Result=Ba(Result1,c,Result2);
if(Result==Inf || Result!=24)
return 0;
return 1;
}
int two(int a,int b,int c){
int Result1,Result2,Result;
Result1=Ba(num[0],a,num[1]);
if(Result1==Inf)
return 0;
Result2=Ba(Result1,b,num[2]);
if(Result2==Inf)
return 0;
Result=Ba(Result2,c,num[3]);
if(Result==Inf || Result!=24)
return 0;
return 1;
}
int three(int a,int b,int c){
int Result1,Result2,Result;
Result1=Ba(num[1],a,num[2]);
if(Result1==Inf)
return 0;
Result2=Ba(num[0],b,Result1);
if(Result2==Inf)
return 0;
Result=Ba(Result2,c,num[3]);
if(Result==Inf || Result!=24)
return 0;
return 1;
}
int four(int a,int b,int c){
int Result1,Result2,Result;
Result1=Ba(num[1],a,num[2]);
if(Result1==Inf)
return 0;
Result2=Ba(num[0],b,Result1);
if(Result2==Inf)
return 0;
Result=Ba(Result2,c,num[3]);
if(Result==Inf || Result!=24)
return 0;
return 1;
}
int five(int a,int b,int c){
int Result1,Result2,Result;
Result1=Ba(num[2],a,num[3]);
if(Result1==Inf)
return 0;
Result2=Ba(num[1],b,Result1);
if(Result2==Inf)
return 0;
Result=Ba(num[0],c,Result2);
if(Result==Inf || Result!=24)
return 0;
return 1;
}
int Judge(){//穷举64种运算
int i,j,k;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
for(k=0;k<4;k++){
if(one(i,j,k) || two(i,j,k) || three(i,j,k) || four(i,j,k) ||
five(i,j,k))//穷举5种次序
return 1;
}
return 0;
}
int Dfs(int x){//穷举24种状态
if(x==4){
if(Judge())
return 1;
return 0;
}
int i;
for(i=0;i<4;i++){
if(!flag[i]){
flag[i]=1;
num[x]=save[i];
if(Dfs(x+1))
return 1;
flag[i]=0;
}
}
return 0;
}
void make(){
memset(flag,0,sizeof(flag));
if(ans[save[0]][save[1]][save[2]][save[3]] || Dfs(0))
{
ans[save[0]][save[1]][save[2]][save[3]]=1;//优化
printf("Yes\n");
}
else
printf("No\n");
}
int main(){
while(scanf("%s%s%s%s",s1,s2,s3,s4)!=EOF){
Exchange();
make();
}
return 0;
}