C++实现24点游戏

1. 题目描述

计算 24 点是一种扑克牌益智游戏,随机抽出 4 张扑克牌,通过加 (+) ,减 (-) ,乘 ( * ),  除 (/) 四种运算法则计算得到整数 24 ,本问题中,扑克牌通过如下字符或者字符串表示,其中,小写 joker 表示小王,大写 JOKER 表示大王:  

                   3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER

本程序要求实现:输入 4 张牌,输出一个算式,算式的结果为 24 点。  

详细说明:  

1. 运算只考虑加减乘除运算,没有阶乘等特殊运算符号, 友情提醒,整数除法要当心 ;  

2. 牌面 2~10 对应的权值为 2~10, J 、 Q 、 K 、 A 权值分别为为 11 、 12 、 13 、 1 ;  

3. 输入 4 张牌为字符串形式,以 一个空格 隔开,首尾无空格;如果输入的 4 张牌中包含大小王,则输出字符串“ ERROR ”,表示无法运算;  

4. 输出的算式格式为 4 张牌通过 +-*/ 四个运算符相连, 中间无空格 , 4 张牌出现顺序任意,只要结果正确;  

5. 输出算式的运算顺序从左至右,不包含括号 ,如 1+2+3*4 的结果为 24

6. 如果存在多种算式都能计算得出 24 ,只需输出一种即可,如果无法得出 24 ,则输出“ NONE ”表示无解。

 

2. 输入描述:

输入4张牌为字符串形式,以一个空格隔开,首尾无空格;

3. 输出描述:

如果输入的4张牌中包含大小王,则输出字符串“ERROR”,表示无法运算;

4. 代码:

思想:穷举法

#include <iostream>
#include <string>
//#include <vector>
#include <algorithm>
using namespace std;

string in[4];
int data[5];
char alg[4]={'+','-','*','/'};//四则运算
int flag=0;
bool isOk()
{
	for(int i=0;i<4;i++)
	{
		if(in[i]=="JOKER"||in[i]=="Joker")
		{
			return false;
		}
	}
	return true;
}

//权重转换
int trans(string s)
{
	int n;
	char c=s[0];
	if(c!='J'&&c!='Q'&&c!='K'&&c!='A')
		n=c-'0';
	else if(c=='J')
		n=11;
	else if(c=='Q')
		n=12;
	else if(c=='K')
		n=13;
	else
		n=1;
	return n;
}

int yunsuan2(int &x1,int x2,int index)//二则运算
{
	switch(alg[index])
	{

	case '+':
		return x1+x2;
		break;
	case '-':
		return x1-x2;
		break;
	case '*':
		return x1*x2;
		break;
	case '/':
		{
			if(x2!=0&&x1%x2==0)
				return x1/x2;
			else 
				return -100;
			break;
		}	
        default:
        return -200;
	}
}

void pro(int a1,int a2,int a3,int a4)//计算,数据顺序
{
	for(int i=0;i<4;i++)
	{	
		int sum=0;//临时变量
		if(flag==1)
			break;
		else
		{			
			sum=yunsuan2(data[a1],data[a2],i);
			int tmp=sum;//临时变量
			for(int j=0;j<4;j++)
			{
				if(flag==1)
					break;
				else
				{
					sum=yunsuan2(sum,data[a3],j);
					int tp=sum;//临时变量,防止后面被改变
					for(int k=0;k<4;k++)
					{
						sum=yunsuan2(tp,data[a4],k);
						if(sum==24&&flag==0)
						{
							cout<<in[a1-1]<<alg[i]<<in[a2-1]<<alg[j]<<in[a3-1]<<alg[k]<<in[a4-1]<<endl;
							flag=1;
							break;
						}
						sum=tp;
					}			
				}
				sum=tmp;
			}
			sum=tmp;//临时变量
		}
		sum=0;
	}

}


int main()
{

	while(cin>>in[0]>>in[1]>>in[2]>>in[3])
	{
		if(isOk())
		{
			//先计算权重
			data[0]=0;
			for(int i=0;i<4;i++)
				data[i+1]=trans(in[i]);
			//sort(data.begin(),data.end());
			//计算24点
			flag=0;
			pro(1,2,3,4);
            if(flag==0)
				pro(1,2,4,3);
			if(flag==0)
				pro(1,3,2,4);
			if(flag==0)
				pro(1,3,4,2);
			if(flag==0)
				pro(1,4,2,3);
			if(flag==0)
				pro(1,4,3,2);
			if(flag==0)
				pro(2,1,3,4);
			if(flag==0)
				pro(2,1,4,3);
			if(flag==0)
				pro(2,3,1,4);
			if(flag==0)
				pro(2,3,4,1);
			if(flag==0)
				pro(2,4,3,1);
			if(flag==0)
				pro(2,4,1,3);
			if(flag==0)
				pro(3,1,2,4);
			if(flag==0)
				pro(3,1,4,2);
			if(flag==0)
				pro(3,2,4,1);
			if(flag==0)
				pro(3,2,1,4);
			if(flag==0)
				pro(3,4,1,2);
			if(flag==0)
				pro(3,4,2,1);
			if(flag==0)
				pro(4,1,3,2);
			if(flag==0)
				pro(4,1,2,3);
			if(flag==0)
				pro(4,2,1,3);
			if(flag==0)
				pro(4,2,3,1);
			if(flag==0)
				pro(4,3,2,1);
			if(flag==0)
				pro(4,3,1,2);
			if(flag==0)
				cout<<"NONE"<<endl;
		}
		else
			cout<<"ERROR"<<endl;
		flag=0;
	}
	return 0;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值