题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1427
思路:
这道题的难点在于你先进行哪几个数的运算。而不是简单的先处理第一个,再处理第二个,再处理第三个,最后处理第四个。
具体的还是看代码的实现吧:
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int res[4]; 5 void dfs(int sum, int cur, int temp); 6 bool flag = 0; 7 int main() 8 { 9 char s[3]; 10 int i,j,k; 11 while(1) 12 { 13 for(i = 0;i < 4;i ++) 14 { 15 if(scanf("%s",s) == EOF) return 0; 16 if(s[0] == 'A') res[i] = 1; 17 else if(s[0] == 'J') res[i] = 11; 18 else if(s[0] == 'Q') res[i] = 12; 19 else if(s[0] == 'K') res[i] = 13; 20 else if(s[0] == '1' && s[1] == '0') res[i] = 10; 21 else res[i] = s[0] - '0'; 22 } 23 sort(res, res+4); 24 flag = 0; 25 do 26 { 27 dfs(res[0], 1, res[1]); 28 }while(next_permutation(res, res+4)&&!flag); 29 if(flag) printf("Yes "); 30 else printf("No "); 31 } 32 return 0; 33 } 34 void dfs(int sum, int cur, int temp) // sum 代表前一个括号内的值,temp代表后一个括号内的值,cur起到计数的作用 35 { 36 if(flag) 37 return; 38 if(cur==3) 39 { 40 if(sum+temp==24) 41 flag=1; 42 if(sum-temp==24) 43 flag=1; 44 if(sum*temp==24) 45 flag=1; 46 if(temp!=0&&sum%temp==0&&sum/temp==24) 47 flag=1; 48 return; 49 } 50 dfs(sum+temp, cur+1, res[cur+1]); 51 dfs(sum-temp, cur+1, res[cur+1]); 52 dfs(sum*temp, cur+1, res[cur+1]); 53 if(temp!=0&&sum%temp==0) 54 dfs(sum/temp, cur+1, res[cur+1]); 55 // 这里就是因为括号改变运算的顺序! 56 dfs(sum, cur+1, temp+res[cur+1]); 57 dfs(sum, cur+1, temp-res[cur+1]); 58 dfs(sum, cur+1, temp*res[cur+1]); 59 if(res[cur+1]!=0&&temp%res[cur+1]==0) 60 dfs(sum, cur+1, temp/res[cur+1]); 61 }