24点游戏

.实验内容

   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;

 

}

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值