速算24点

速算24点相信绝大多数人都玩过。就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用'+','-','*','/'运算符以及括号改变运算顺序,使得最终运算结果为24(每个数必须且仅能用一次)。游戏很简单,但遇到无解的情况往往让人很郁闷。你的任务就是针对每一组随机产生的四张牌,判断是否有解。我们另外规定,整个计算过程中都不能出现小数。

输入

每组输入数据占一行,给定四张牌。

输出

每一组输入数据对应一行输出。如果有解则输出"Yes",无解则输出"No"。

样例输入

样例输出

Yes
No

解题思路  括号  (x1@y1)@(x1@y1) 和((x1@y1)@x2)@y2  这两种方式 运用前排列就行了 

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 map<string,int> ma;
 4 int card[10],flag;
 5 string name;
 6 bool judge(int x){ return x==24; }
 7 void dfs(int shu1,int shu2,int pos){
 8     if(flag==1) return;
 9     if(pos==4){
10         if(judge(shu1+shu2)||judge(shu1-shu2)||judge(shu1*shu2)) flag=1;
11         else{
12             if(shu2!=0&&shu1%shu2==0&&judge(shu1/shu2)) flag=1;
13         }
14         return;
15     }
16     dfs(shu1+shu2,card[pos+1],pos+1);
17     dfs(shu1-shu2,card[pos+1],pos+1);
18     dfs(shu1*shu2,card[pos+1],pos+1);
19     if(shu2!=0&&shu1%shu2==0) dfs(shu1/shu2,card[pos+1],pos+1);
20     dfs(shu1,shu2+card[pos+1],pos+1);
21     dfs(shu1,shu2-card[pos+1],pos+1);
22     dfs(shu1,shu2*card[pos+1],pos+1);
23     if(card[pos+1]!=0&&shu2%card[pos+1]==0) dfs(shu1,shu2/card[pos+1],pos+1);
24 }
25 
26 int main(){
27     ma["1"]=1,ma["2"]=2,ma["3"]=3,ma["4"]=4,ma["5"]=5,ma["6"]=6;
28     ma["7"]=7,ma["8"]=8,ma["9"]=9,ma["10"]=10,ma["A"]=1,ma["J"]=11,ma["Q"]=12,ma["K"]=13;
29     while(cin>>name){
30         flag=0;
31         card[1]=ma[name];
32         for(int i=2;i<=4;i++) cin>>name,card[i]=ma[name];
33         sort(card+1,card+1+4);
34         do{
35             dfs(card[1],card[2],2);
36         }while(next_permutation(card+1,card+1+4)&&flag!=1);
37         printf("%s
",flag?"Yes":"No");
38     }
39     return 0;
40 }
View Code
原文地址:https://www.cnblogs.com/qq-1585047819/p/11414818.html