C++实现经典24点纸牌益智游戏
作者:晴水如蓝 发布时间:2023-04-22 01:05:02
标签:C++,纸牌,游戏
本文为大家分享了经典24点纸牌益智游戏的具体实现方法,供大家参考,具体内容如下
一.实验内容
24点游戏是经典的纸牌益智游戏。
常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。
1.程序风格良好(使用自定义注释模板)
2.列出表达式无重复。
二.算法设计思路
算法描述:
1.通过rand()函数生成4个随机数
2.通过F()函数进行递归调用
3.首先将数组A中的两个数进行运算,得到结果,然后通过递归调用将结果与下一个数字运算,得到结果再通过递归调用,与最后一个数进行运算
4.递归过程中,判断是否(n==1&&A[0]==24),满足条件则输出结果。最后通过count最终知道有多少种解法
三.代码实现
#include<iostream>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<ctime>
using namespace std;
int n=4; //三次运算标记值
double A[4]={0}; //存储4个数字
char oper[4]={'+','-','*','/'}; //存储运算符
string B[4];
int count=0;
int F(int n){
//判断是否已完成三次运算
if(n==1){
if(A[0]==24) //判断结果是否为24
{
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]; //将最后一位数赋给A[j]
x=B[i];
y=B[j];
B[j]=B[n-1]; //最后一位数字放入B[j]中
//加法
A[i]=a+b; //第一个空间保存前两个数的运算结果
B[i]='('+x+'+'+y+')'; //将运算结果存入数组B中
F(n-1);
//减法
//考虑两种情况:1. a-b 2. b-a
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);
//除法
//考虑两种情况:1. a/b 2. b/a 同时需要判断分母不为零
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);
}
//当以上四则运算的结果都不能满足条件时
//进入下一个for循环之前, 需要将之前的i和j上的值都找回,即赋值
A[i]=a;
A[j]=b;
B[i]=x;
B[j]=y;
}
}
}
class RandNum{
public:
RandNum(){
srand(time(0));
}
double get(int begin = 0, int end = 1){
return rand()%(end-begin+1)+begin;
}
};
int main(void)
{
RandNum r;
for (int i = 0; i < 4; i++) { //生成4个1~13之间的数字
A[i]=r.get(1,13); //将生成的数字存入数组A中
cout<<A[i]<<" ";
}
cout<<endl;
for(int i=0;i<4;i++){
if(A[i]==1) B[i]='A';
else if(A[i]==10) B[i]="10";
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 B[i]='0'+A[i];
}
F(n);
cout<<endl<<"总共有 "<<count<<" 种解法"<<endl;
return 0;
}
四.测试及运行结果
五.经验归纳
这次的程序设计采用了递归调用的方式,使得问题一步步化简,即每次都是两个数字进行运算,得到结果,结果再与下一个数字进行运算,直到满足终止条件,结束递归。递归这种思想虽然很好写出,但难以理解,尤其是对一些大型的算法。通过这次的程序设计,我对递归有了更深的认识。虽然递归的执行效率很低,但是有一些问题必须使用递归解决,因此我会在以后的程序设计中经常用到递归,提高对于递归的理解能力。
来源:https://blog.csdn.net/qq_43165874/article/details/89298294
0
投稿
猜你喜欢
- DataTable.Select()根据条件筛选数据很多时候我们获取到一个表的时候需要根据表的包含的队列去筛选内容,一般来说可能想到的就是遍
- 深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象
- @Bean修饰的方法参数的注入方法参数默认注入方式为Autowired,即先根据类型匹配,若有多个在根据名称进行匹配。1:复杂类型可以通过@
- 什么是Dozer?Dozer是一种Java Bean到Java Bean的映射器,递归地将数据从一个对象复制到另一个对象,它是一个强大的,通
- 使用Mybatis-Plus的SqlSessionFactory问题前些日子工作中出现一个问题,项目中使用了MybatisPlus,然后出现
- 1 配置文件的方法我们编写spring 框架的代码时候。一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量
- 业务需要动态给图片增加文字(书本的封面图片),修改字体大小、字体、颜色、控制位置测试代码:string path = @"E:\c
- 本篇主要介绍C#的Excel导入、导出,供大家参考,具体内容如下一. 介绍1.1 第三方类库:NPOI说明:NPOI是POI项目的.NET
- Java反射动态修改注解的某个属性值昨晚看到一条问题,大意是楼主希望可以动态得建立多个Spring 的定时任务。这个题目我并不是很熟悉,不过
- 一、什么是内存泄漏内存泄漏是指你向系统申请分配内存进行使用(new/malloc),然后系统在堆内存中给这个对象申请一块内存空间,但当我们使
- 本文实例为大家分享了Unity3d实现Flappy Bird的具体代码,供大家参考,具体内容如下一、小鸟在游戏中,小鸟并不做水平位移,而是通
- 介绍责任链模式是一种行为型设计模式,其目的是将请求从一个对象传递到另一个对象,直到找到能够处理该请求的对象为止.再责任链模式中,每个对象都持
- 反射对效率有影响 慎用!!!1.对象结构public class BusinessDept {private String yea
- 一、问题描述开发中,需要使Decimal类型数据保留小数点后的两位小数且不需要进行四舍五入操作,即直接截取小数点后面的两位小数即可。例如:1
- 命令仓库 Ctrl + Shift + A 可以搜集对应命令快捷键1、基础快捷键1.1、无处不在的跳转项目之间的跳转1.1.1、项目项目之间
- 一、前言系统执行业务逻辑之前,会对输入数据进行校验,检测数据是否有效合法的。所以我们可能会写大量的if else等判断逻辑,特别是在不同方法
- java抠图片文字或签名运行原理第一步 遍历像素点BufferedImage image = ImageIO.read(new File(i
- 一、事务隔离级别①介绍数据库系统必须具有隔离并发运行各个事务的能力,使它们不会相互影响,避免各种并发问题。一个事 务与其他事务隔离的程度称为
- 编写按钮属性首先再values/themes 或者values/style在文件下编写按钮属性buttonBarPositiveButton
- 使用范围: 只能作用在方法和构造函数之上@SneakyThrows注解的作用得从java的异常设计体系说起。java中常见的异常有两种:Ex