一.实验内容
24点游戏是经典的纸牌益智游戏。常见游戏规则:从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。
二. 算法设计
在随机产生数据中遍历选择两个数,共有 P(4,2) 种排列,对每一个排列,进行 + - * / 运算;将产生结果放入原数组A[i],将最后一个放入原数组第j个;产生新数组递归调用F(n)找到第一个表达式则返回;当不满足条件时,重新赋值计算。用n作为运算次数传递参数,每次只选取两个,不用考虑括号问题。
本程序在做除法运算时,精度存在问题,存在四舍五入的情况,导致一部分运算结果出现问题。
三.程序框图
四.测试及调试
随机产生4个数据
在数组中选取两个数赋值给A,B,并将最后一位赋给A[j]
#include<iostream>
#include <math.h>
#include<string>
#include<time.h>
using namespace std;
int n=4;//三次运算标记值
float A[4];//储存4个数字
char oper[4]={'+','-','*','/'};
string B[4];
int count=0;
int F(int n)//判断是否完成三次运算
{
if(n==1)
{
if(fabs(A[0]-24.00)==0.00)
{
cout<<B[0]<<endl;//B[0]中包含表达式
count++;
}
}
for(int i=0;i<n;i++)//在数组任意取两个数
{
for(int j=i+1;j<n;j++)
{
double a,b;
string x,y;
a=A[i];b=A[j];
A[j]=A[n-1];//将最后一位赋给j
x=B[i];y=B[j];
B[j]=B[n-1];
A[i]=a+b;//加法运算
B[i]='('+x+'+'+y+')';//运算结果存入数组
F(n-1);
A[i]=a-b;//减法运算
B[i]='('+x+'-'+y+')';
F(n-1);
A[i]=b-a;
B[i]='('+y+'-'+x+')';
F(n-1);
A[i]=a*b;//乘法运算
B[i]='('+x+'*'+y+')';
F(n-1);
if(b!=0)
{
A[i]=a/b;//除法运算
B[i]='('+x+'/'+y+')';
F(n-1);
}
if(a!=0)
{
A[i]=b/a;
B[i]='('+y+'/'+x+')';
F(n-1);
}
A[i]=a;A[j]=b;//不满足条件时,将值重新赋予
B[i]=x;B[j]=y;
}
}
return 0;
}
void main()
{
srand((unsigned)time(0));
for(int i=0;i<4;i++)
{
A[i]=rand()%13+1;//随机产生1~13之间的数字
cout<<A[i]<<" ";
}
cout<<endl;
{
for(int i=0;i<4;i++)
{
if (A[i]==1) B[i]='A';
else if(A[i]==11) B[i]='J';
else if(A[i]==12) B[i]='Q';
else if(A[i]==13) B[i]='K';
else if(A[i]==10) B[i]='T';
else B[i]='0'+A[i];
}
}
F(n);
cout<<"解法共"<<count<<endl;
}