编程输出完美之星编程大赛 复赛第二场 24点
文章结束给大家来个程序员笑话:[M]
标题描述:
描述: 两人用一副扑克(王牌除去)玩24点,规则是这样的:两人各出2张牌,谁先算出来谁赢,赢家收回已算过的4张牌,最后看谁手里的牌多。四张牌分别用4个扑克牌面字符表示。A,1,2,3,4,5,6,7,8,9,10,J,Q,K 分别代表数字1,2,3,4,5,6,7,8,9,10,11,12,13。其中每张牌只能应用一次;任意应用 +, –, *, /, ( ) ,构造出一个表达式,使得最终结果为24。
Input: 输入的第一行正整数N代表须要求解测试集合数目。接下来的N行代表每个测试 集,分别用四个字符代表四张牌面。
Output: 对于每个测试集,如果存在能算出24点的计划,即输出表达式。如果存在多个,只须要输出一个即可。而对于不能算出24点的测试集,输出字符串“NULL”。
Sample Input:
3
A 4 5 6
A Q 2 A
7 7 7 7
Sample Output:
6/((5/4)-A)
(A/A)*2*Q
NULL
思绪:将4元运算,一直的转换为2元运算,放在数组的首位,当递归深度为3的时候判断。网上24点游戏的算法很多,鉴戒了一下前csdn版主的思绪写的代码。
#include <iostream> #include <string> #include <cmath> #include <sstream> using namespace std; const double wucha=1E-6; //浮点除法有精度损失 double num[4]; string expression[4]; //表达式 bool flag; void game24(int n){ if(n==1){ if(fabs(num[0]-24)<=wucha){ flag=1; for(int i=1;i!=expression[0].size()-1;i++)//输出的时候最外层的一个括号去掉 cout<<expression[0][i]; cout<<endl; return ; } } if(flag)return ; //找到满足的一组即可 for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) { double a,b; string exa,exb; a=num[i]; b=num[j]; num[j]=num[n-1]; //用最后一个元素覆盖,注意这里的n在每次递归中是要递减的 exa = expression[i]; exb = expression[j]; expression[j] = expression[n-1]; expression[i]= '('+ exa + '+' + exb + ')'; num[i] = a + b; game24(n-1); expression[i]='('+ exa+ '-' + exb + ')'; num[i] = a - b; game24(n-1); expression[i] = '('+exb + '-' + exa + ')'; num[i] = b -a; game24(n-1); expression[i]= '('+ exa +'*'+ exb+ ')'; num[i]=a*b; game24(n-1); if (b != 0) { expression[i] ='('+exa+'/' + exb + ')'; num[i] = a / b; game24(n-1); } if (a != 0) { expression[i]='('+exb + '/'+ exa + ')'; num[i] = b / a; game24(n-1); } num[i]=a; num[j]=b; expression[i] = exa; expression[j] = exb; //递归恢复 } } } int main() { int n; cin>>n; while(n--) { cin>>expression[0]>>expression[1]>>expression[2]>>expression[3]; for(int i=0;i<4;i++){ if(expression[i]=="A")num[i]=1; else if(expression[i]=="J")num[i]=11; else if(expression[i]=="Q")num[i]=12; else if(expression[i]=="K")num[i]=13; else if(expression[i]=="10")num[i]=10; else { char tmp=expression[i][0]; num[i]=tmp-'0'; } } flag=0; game24(4); if(!flag)cout<<"NULL"<<endl; } }
文章结束给大家分享下程序员的一些笑话语录: 面试官:熟悉哪种语言
应聘者:JAVA
面试官:知道什么叫类么
应聘者:我这人实在,工作努力,不知道什么叫累
面试官:知道什么是包?
应聘者:我这人实在 平常不带包 也不用公司准备了
面试官:知道什么是接口吗?
应聘者:我这个人工作认真。从来不找借口偷懒
面试官:知道什么是继承么
应聘者:我是孤儿没什么可以继承的
面试官:知道什么叫对象么?
应聘者:知道,不过我工作努力,上进心强,暂时还没有打算找对象。
面试官:知道多态么?
应聘者:知道,我很保守的。我认为让心爱的女人为了自已一时的快乐去堕胎是不道德的行为!请问这和C#有什么关系??
---------------------------------
原创文章 By
编程和输出
---------------------------------