24点游戏
描述
几十年前全世界就流行一种数字扑克游戏,至今仍有人乐此不疲.在中国我们把这种游戏称为“算24点”。您作为游戏者将得到4个1-13(在扑克牌里用A代替1,J代替11,Q代替12,K代替13)之间的自然数作为操作数,而您的任务是对这4个操作数进行适当的算术运算,判断运算结果是否等于24。能输出1,不能输出0。
格式
输入格式
四个牌面值。牌面值与牌面值之间用一个空格隔开。
输出格式
输出0或1。
限制
每个测试点1s
View Code
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<cmath> 5 #define exp 1e-6 6 using namespace std; 7 int dd[5]; 8 bool flag[5]; 9 bool mark; 10 void dfs(int step,double sum) 11 { 12 if(step==4) 13 { 14 if(fabs(sum-24)<exp) 15 { 16 mark=true; 17 } 18 return; 19 } 20 if(mark) 21 return; 22 int i; 23 for(i=0;i<4;i++) 24 { 25 if(!flag[i]) 26 { 27 28 flag[i]=true; 29 dfs(step+1,sum*dd[i]*1.0); 30 if(mark) 31 return; 32 dfs(step+1,sum+dd[i]*1.0); 33 if(mark) 34 return; 35 dfs(step+1,sum-dd[i]*1.0); 36 if(mark) 37 return; 38 dfs(step+1,dd[i]*1.0-sum); 39 if(mark) 40 return; 41 if(dd[i]!=0) 42 { 43 dfs(step+1,sum/(dd[i]*1.0)); 44 if(mark) 45 return; 46 } 47 if(sum!=0) 48 { 49 dfs(step+1,(dd[i]*1.0)/sum); 50 if(mark) 51 return; 52 } 53 flag[i]=false; 54 } 55 } 56 } 57 58 int main() 59 { 60 char num[5][5]; 61 62 while(~scanf("%s",num[0])) 63 { 64 if(num[0][0]=='2' || num[0][0]=='3' ||num[0][0]=='4' || num[0][0]=='5' || num[0][0]=='6' || num[0][0]=='7' || num[0][0]=='8' || num[0][0]=='9') 65 dd[0]=num[0][0]-'0'; 66 else if(num[0][0]=='A') 67 dd[0]=1; 68 else if(num[0][0]=='J') 69 dd[0]=11; 70 else if(num[0][0]=='Q') 71 dd[0]=12; 72 else if(num[0][0]=='K') 73 dd[0]=13; 74 else 75 dd[0]=10; 76 int i; 77 for(i=1;i<4;i++) 78 { 79 scanf("%s",num[i]); 80 if(num[i][0]=='2' || num[i][0]=='3' ||num[i][0]=='4' || num[i][0]=='5' || num[i][0]=='6' || num[i][0]=='7' || num[i][0]=='8' || num[i][0]=='9') 81 dd[i]=num[i][0]-'0'; 82 else if(num[i][0]=='A') 83 dd[i]=1; 84 else if(num[i][0]=='J') 85 dd[i]=11; 86 else if(num[i][0]=='Q') 87 dd[i]=12; 88 else if(num[i][0]=='K') 89 dd[i]=13; 90 else 91 dd[i]=10; 92 } 93 memset(flag,false,sizeof(flag)); 94 mark=false; 95 for(i=0;i<4;i++) 96 { 97 flag[i]=true; 98 dfs(1,dd[i]*1.0); 99 flag[i]=false; 100 } 101 if(mark) 102 printf("1\n"); 103 else 104 printf("0\n"); 105 } 106 return 0; 107 }
这是一道深搜题目,首先计算所有的排列顺序,运用所有的运算符号,这样可以忽略括号带来的运算优先级的不同,值得注意的是减法和除法运算要考虑a-b和b-a两种可能,a/b 和b/a,还必须保证分母不能为0,其他的都是深搜模板了。