标签:24 ma shu1 速算 pos dfs shu2 card
速算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\n",flag?"Yes":"No"); 38 } 39 return 0; 40 }View Code
标签:24,ma,shu1,速算,pos,dfs,shu2,card 来源: https://www.cnblogs.com/qq-1585047819/p/11414818.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。