速算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 这两种方式 运用前排列就行了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }