编程输出完美之星编程大赛 复赛第二场 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
编程和输出
---------------------------------

posted @ 2013-06-01 20:59  xinyuyuanm  阅读(200)  评论(0编辑  收藏  举报