24点游戏
来源:互联网 发布:日本高铁速度 知乎 编辑:程序博客网 时间:2024/06/06 04:05
题目: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;//如果没有找到结果,符号位为0outfile<<"======================================================================="<<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;}
0 0
- 24点游戏代码
- 24点游戏
- 24点扑克牌游戏
- 24点游戏
- 24点游戏
- 《24点游戏》
- 24点游戏
- 24点游戏
- 24点游戏
- 24点游戏
- 24点游戏
- 24点游戏
- 24点游戏
- 24点游戏源码
- 24点游戏
- 24点游戏-hero
- 24点游戏
- 24点游戏算法
- leetcode AddTwoNumbers 题解
- AndroidStudio强制转换快捷键
- 编写可靠shell脚本的八个建议
- 基于ORB特征提取算法图像匹配 python实现
- 【二分查找】用C语言实现一个有序数组的二分查找
- 24点游戏
- BaiduMap基础
- HDU1875 畅通工程再续
- 简单24点游戏
- Java面向对象
- spring注解方式 idea报could not autowire
- 九度OJ题目1183:守形数
- for循环创建二维数组
- LINUX 命令 4.13