24点游戏

题目:24点游戏,从1到k选四张排,用加减乘除得到24
编辑人员:李林轩
时间:2017.4.9
程序说明:在input.txt文件里面输入想要计算的四个数据,程序运行后在output.txt文件里面进行结果展示。txt文件需要自己建立并且名字不能改,否则程序无法调用文件里
面的数据
#include<iostream>
#include<fstream>
#include<cmath>
using namespace std;
char sign[4]={'+','-','*','/'};
//定义一个全局变量,用于储存加减乘除符号,方便下面符号判断
class game24point
//24点纸牌游戏类
{
private:
	double  a[4];
	//为实现精确计算,防止计算结果为小数却被强制转换为整数,采用double变量
public:
 	game24point();
	//构造函数
	double  calcute(double,double,char);
	//计算函数,给出一个符号两个有顺序的数,计算结果
	void search();
	//搜索函数,用于寻找合适的解
	void print();
	//打印得到的四张纸牌的数值
};
game24point::game24point()
{
	char ch[4];
	//由于纸牌中除了数字还有AJQK等字符,故使用字符数组
	ifstream infile("input.txt");
	if(!infile)
	//若打开失败
	{
		cout<<"打开文件input.txt失败!"<<endl;
		exit(1);
	}	
	for(int i=0;i<4;i++) infile>>ch[i];
	//在input文件中读取数据                                        
	cout<<"正在从input.txt中读取数据,请稍等..."<<endl;
	for(i=0;i<4;i++)
	{
		if(ch[i]=='A') a[i]=10;
		else if(ch[i]=='J') a[i]=11;
		else if(ch[i]=='Q') a[i]=12;
		else if(ch[i]=='K') a[i]=13;
		else if(ch[i]=='1') a[i]=1;
		else if(ch[i]=='2') a[i]=2;
		else if(ch[i]=='3') a[i]=3;
		else if(ch[i]=='4') a[i]=4;
		else if(ch[i]=='5') a[i]=5;
		else if(ch[i]=='6') a[i]=6;
		else if(ch[i]=='7') a[i]=7;
		else if(ch[i]=='8') a[i]=8;
		else if(ch[i]=='9') a[i]=9;
		else 
		{
			cout<<"第"<<i+1<<"个数据输入有误!"<<endl;
			exit(1);
		}
	}	
	//纸牌字符转换为数值
	infile.close();
}
double  game24point::calcute(double a,double b,char index)
{
	if(index=='+') return a+b;
	//若为+,则返回相应结果
	else if(index=='-') return a-b;
	else if(index=='*') return a*b;
	else if(index=='/') if(b!=0) return a/b; 	
	//只有当分母不为0时,返回结果
}	
void game24point::search()
{
	double  temp[3],tem[2];
	//第一个符号放置后,经过计算后相当于剩下三个数,这个数组用于存储这三个数
	double  sum;
	//求得的和
	int  judge=0;
	//判断是否找到一个合理的解
	ofstream outfile("output.txt",ios::app);
	//以输出的方式打开文件
	if(!outfile)
	//若文件打开失败
	{
		cout<<"打开文件output.txt失败"<<endl;
		exit(1);
	}
	cout<<"正在计算结果,请等待..."<<endl;
	outfile<<"======================================================================="<<endl;
	outfile<<"本次24点游戏求得结果如下"<<endl;     
	for(int i=0;i<4;i++)
	//第一次放置的符号
	{
		for(int j=0;j<4;j++)
		//第二次放置的符号
		{
			for(int k=0;k<4;k++)
			//第三次放置的符号
			{
				for(int m=0;m<3;m++)
				//首先计算的两个相邻数字,共有3种情况,相当于括号的作用
				{
					if(a[m+1]==0 && sign[i]=='/') break;
					temp[m]=calcute(a[m],a[m+1],sign[i]);
					temp[(m+1)%3]=a[(m+2)%4];
					temp[(m+2)%3]=a[(m+3)%4];
					//先确定首先计算的两个数字,计算完成相当于剩下三个数,按顺序储存在temp数组中
					for(int n=0;n<2;n++)
					//三个数字选出先计算的两个相邻数字,两种情况,相当于第二个括号
					{
						if(temp[n+1]==0 && sign[j]=='/') break;
						tem[n]=calcute(temp[n],temp[n+1],sign[j]);
						tem[(n+1)%2]=temp[(n+2)%3];
						//先确定首先计算的两个数字,计算完成相当于剩下两个数,按顺序储存在temp数组中
						if(tem[1]==0 && sign[k]=='/') break;
						sum=calcute(tem[0],tem[1],sign[k]);
						//计算和
						if(sum==24) 
						//若和为24
						{
							judge=1;
							//判断符为1,表示已求得解

							if(m==0 && n==0) 
								outfile<<"(("<<a[0]<<sign[i]<<a[1]<<")"<<sign[j]<<a[2]<<")"<<sign[k]<<a[3]<<"="<<sum<<endl;
								
							else if(m==0 && n==1)
								outfile<<"("<<a[0]<<sign[i]<<a[1]<<")"<<sign[k]<<"("<<a[2]<<sign[j]<<a[3]<<")="<<sum<<endl;
								
							else if(m==1 && n==0)
								outfile<<"("<<a[0]<<sign[j]<<"("<<a[1]<<sign[i]<<a[2]<<")"<<sign[k]<<a[3]<<"="<<sum<<endl;
								
							else if(m==1 && n==1)
								outfile<<a[0]<<sign[k]<<"(("<<a[1]<<sign[i]<<a[2]<<")"<<sign[j]<<a[3]<<")="<<sum<<endl;
								
							else if(m==2 && n==0)
								outfile<<"("<<a[0]<<sign[j]<<a[1]<<")"<<sign[k]<<"("<<a[2]<<sign[i]<<a[3]<<")="<<sum<<endl;
								
							else if(m==2 && n==0)
								outfile<<a[0]<<sign[k]<<"("<<a[1]<<sign[j]<<"("<<a[2]<<sign[i]<<a[3]<<"))="<<sum<<endl;
								//m=0,1,2 n=0,1表示六种括号放置可能,并按照这六种可能输出相应的格式的计算式	
						}	
					}
				}
			}
		}
	}
	if(judge==0) outfile<<"这四张扑克牌无法找到一个合理的解"<<endl;
	//如果没有找到结果,符号位为0
	outfile<<"======================================================================="<<endl;
	outfile<<endl<<endl;
	outfile.close();
	cout<<"计算完成,结果已保存在output.txt文件中!"<<endl;	
}	
void game24point::print()
{
	cout<<"读取成功!"<<endl;
	
	for(int i=0;i<4;i++)
	{
		cout<<"第"<<i+1<<"张牌  "<<a[i]<<endl;
	}
}
int main(void)
{
	game24point obj;
	obj.print();
	cout<<endl;
	obj.search();
	cout<<endl;
	system("PAUSE");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值