题解 | #24点运算#
24点运算
https://www.nowcoder.com/practice/7e124483271e4c979a82eb2956544f9d
#include <stdio.h> #include <string.h> #include <stdlib.h> //DFS暴力枚举 int visit[4]={0},result_index=0,cal_char_index=0; int result[4]={0}; char cal_char[4]={0}; int dfs(int a[],int sum){ if(sum==24&&cal_char_index==3){ return 1; }else{ for(int i=0;i<4;i++){ if(!visit[i]){ visit[i]=1; int flag; result[result_index++]=a[i]; cal_char[cal_char_index++]='+'; if(dfs(a,sum+a[i])==0){ cal_char[--cal_char_index]='-'; cal_char_index++; if(dfs(a,sum-a[i])==0){ cal_char[--cal_char_index]='*'; cal_char_index++; if(dfs(a,sum*a[i])==0){ cal_char[--cal_char_index]='/'; cal_char_index++; if(dfs(a,sum/a[i])==0){//加减乘除都不行 cal_char[--cal_char_index]='\0';//回溯 visit[i]=0;//回溯 result[--result_index]=0;//回溯 }else return 1; }else return 1; }else return 1; }else return 1; } } return 0;//找了4个都没找到或者全部数字用完 } } int main() { int num[4]={0}; char str[4][6]={0}; scanf("%s %s %s %s",str[0],str[1],str[2],str[3]); int len; for(int i=0;i<4;i++){ len=strlen(str[i]); if(len>2){ printf("ERROR\n"); return 0; } else{ if(len==2) num[i]=10; else{ if(str[i][0]>='2'&&str[i][0]<='9') num[i]=str[i][0]-'0'; else{ switch (str[i][0]) { case 'J':num[i]=11;break; case 'Q':num[i]=12;break; case 'K':num[i]=13;break; case 'A':num[i]=1;break; } } } } } //初始化结束,开始深搜 for(int i=0;i<4;i++){ result[0]=num[i]; result_index++; visit[i]=1; if(dfs(num, num[i])==0){ result_index--; result[0]=0; visit[i]=0; }else{//找到符合条件的第一个序列,做输出处理 if(result[0]>=2&&result[0]<=9) printf("%c",result[0]+'0'); else{ switch (result[0]) { case 1:printf("A");break; case 10:printf("10");break; case 11:printf("J");break; case 12:printf("Q");break; case 13:printf("K");break; } } for(int i=0;i<3;i++){ printf("%c",cal_char[i]); if(result[i+1]>=2&&result[i+1]<=9) printf("%c",result[i+1]+'0'); else{ switch (result[i+1]) { case 1:printf("A");break; case 10:printf("10");break; case 11:printf("J");break; case 12:printf("Q");break; case 13:printf("K");break; } } } return 0; } } //没找到序列 printf("NONE\n"); return 0; }