题面:https://www.nowcoder.com/practice/7e124483271e4c979a82eb2956544f9d?tpId=37&tqId=21312&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=
给四张牌,判断能不能算24点。
先把牌转换成对应数值,存在结构体内。存在大小王则直接ERROR。
因为牌的顺序可以变换。就四重循环枚举所有排列,对于每种排列Dfs判断能否得出24点。id数组用于存储每种排列对应的编号。
如果可以就弹出,并输出结构体中的结果。
若不存在答案,输出NONE。
注意运算顺序强制控制为从左到右。我一开始没看到这个条件,以为还有优先级,都不太会写…强制抹去优先级后就容易多了。
1 #include<bits/stdc++.h> 2 using namespace std; 3 char fuhao[5]; 4 int id[10]; 5 bool book[10]; 6 struct Pai{ 7 int num; 8 char s[10]; 9 }pai[5]; 10 void init(){ 11 for(int i=1;i<=4;i++) 12 scanf("%s",pai[i].s); 13 for(int i=1;i<=4;i++){ 14 int len=strlen(pai[i].s); 15 char c=pai[i].s[0]; 16 if(len==1){ 17 if(c>='2'&&c<='9')pai[i].num=c-'2'+2; 18 else if(c=='J') pai[i].num=11; 19 else if(c=='Q') pai[i].num=12; 20 else if(c=='K') pai[i].num=13; 21 else if(c=='A') pai[i].num=1; 22 } 23 if(len==2) pai[i].num=10; 24 if(len==5){ 25 puts("ERROR"); 26 exit(0); 27 } 28 } 29 return; 30 } 31 void Output(){ 32 printf("%s",pai[id[1]].s); 33 for(int i=2;i<=4;i++){ 34 printf("%c",fuhao[i]); 35 printf("%s",pai[id[i]].s); 36 } 37 exit(0); 38 return; 39 } 40 void Dfs(int top,int nowsum){ 41 if(top>4){ 42 if(nowsum==24){ 43 Output(); 44 return; 45 } 46 return; 47 } 48 fuhao[top]='+'; 49 Dfs(top+1,nowsum+pai[id[top]].num); 50 fuhao[top]='-'; 51 Dfs(top+1,nowsum-pai[id[top]].num); 52 fuhao[top]='*'; 53 Dfs(top+1,nowsum*pai[id[top]].num); 54 fuhao[top]='/'; 55 Dfs(top+1,nowsum/pai[id[top]].num); 56 return; 57 } 58 int main(){ 59 init(); 60 for(int i=1;i<=4;i++)book[i]=1; 61 for(int i=1;i<=4;i++){ 62 book[i]=0; 63 for(int j=1;j<=4;j++){ 64 if(book[j]){ 65 book[j]=0; 66 for(int m=1;m<=4;m++){ 67 if(book[m]){ 68 book[m]=0; 69 for(int n=1;n<=4;n++){ 70 if(book[n]){ 71 id[1]=i; 72 id[2]=j; 73 id[3]=m; 74 id[4]=n; 75 Dfs(2,pai[id[1]].num); 76 } 77 } 78 book[m]=1; 79 } 80 } 81 book[j]=1; 82 } 83 } 84 book[i]=1; 85 } 86 puts("NONE"); 87 return 0; 88 }
标签:24,运算,nowsum,top,Dfs,num,HJ89,id From: https://www.cnblogs.com/AlenaNuna/p/18395564