24点游戏

24点游戏 c++ 一.题目 24点游戏规则:从扑克中每次取出4张牌。使用加减乘除第一个能得出24者为赢。(其中J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。 基本要求:随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。 1.程序设计风格良好(使用自定义注释模板) ... 阅读详情
24点是一种老少皆宜的游戏,它的具体玩法如下:

给玩家4张牌,每张牌的面值都在1---13之间,允许其中有数值相同的牌。采用加、减、乘、除四则运算,允许中间运算存在小数,并且可以使用括号,但每张牌只能使用一次,尝试构造一个多项式,使其运算结果为24.

输入:n1,n2,n3,n4。

输出:若能得到运算结果为24,则输出一个对应的计算表达式。

输入:11,8,3,5

输出:(11-8)*(3+5) = 24

分析与解法

最直接的想法就是采用穷举法,因为运算符号只有4种,每个数字只能使用一次,所以通过穷举4个数所有可能的表达式,并分别计算出各表达式的值,就可以得到答案。那么如何穷举所有可能的表达式呢?

先不考虑使用括号,可以做出如下分析:

每个数只能使用一次,对4个整数进行全排列,总共有4!=4*3*2*1=24中排列。4个数的四则运算中总共需要3个运算符,同一运算符可以重复出现,那么对于每一个排列,总共可有4*4*4中表达式。因此在不考虑括号的情况下,总共可以得到4!*4*4*4=1536中表达式。

接下来再考虑加上括号后的情况,对于4个数而言,总共会有以下5种加括号的方式:

(A(B(CD)))、(A((BC)D))、((AB)(CD))、((A(BC))D)、(((AB)C)D)。

所以需要遍历的表达式数最多有4!*4*4*4*5=7680种。即使采用逆波兰表达式,其总数也不变。

通过上面的分析,得到了一种解24点的基本思路,即遍历运算符、数字和括号的所有排列组合形式,接下来,我们将更加细致地讨论这种解法的一个具体实现。

假设给定的4个数组成的集合为A={1,2,3,4},定义函数f(A)为对集合A中的元素进行所有可能的四则混合运算所得到的值。

首先从集合A中任意取出两个数,如取出1和2,A=A-{1,2},对取出来的数分别进行不同的四则运算,1+2=3,1-2=-1,1/2=0.5,1*2=2,将得到的结果再分别加入集合A,可得到B={3,3,4},C={-1,3,4},D={0.5,3,4},E={2,3,4}四个新的集合,那么f(A)= f(B)+f(C)+f(D)+f(E),通过以上的计算就达到了分而治之的目的,问题规模就从4个数降到了3个数,成了3个数的4个子问题之和。综上所述,可以得到递归解法如下:

将给定的4个数放入数组Array中,将其作为参数传入函数f中,伪代码如下所示:

f(Array)
{
	if(Array.Length < 2)
	{
		if(得到的最终结果为)
			输出表达式
		else   输出无法构造符合要求的表达式
	}
	foreach(从数组中任取两个数的组合)
	{
		foreach(运算符(+, -, *, /))
		{
			1、计算该组合在此运算符下的结果
			2、将该组合中的两个数从原数组中移除,并将步骤的计算结果放入数组
			3、对新数组递归调用f。如果找到一个表达式则返回
			4、将步骤的计算结果移除,并将该组合中的两个数重新放回数组中对应的位置
		}
	}
}

具体代码如下所示:

#include "iostream"
#include "cmath"
#include "string"
using namespace std;

const double Threshold = 1E-6;      //容差值
const int CardsNumber = 4;
const int ResultValue = 24;
double number[CardsNumber];         //输入的4个整数
string result[CardsNumber];         //保存表达式

bool PointsGame(int n)
{
	if(n == 1)
	{
		//由于浮点数运算会有精度误差,所以用一个很小的数1E-6来做容差值
		if(fabs(number[0] - ResultValue) < Threshold)
		{
			cout << result[0] << " == 24" << endl;
			return true;
		}
		else
		{
			return false;
		}
	}
	for(int i = 0; i < n; i++)
	{
		for(int j = i + 1; j < n; j++)     //从数组中任取两个数的组合
		{
			double a, b;
			string expa, expb;

			a = number[i];
			b = number[j];
			number[j] = number[n-1];     //任取两个数并将其结果放入数组后,原数组的个数减少一个

			expa = result[i];            //保存表达式中的数字
			expb = result[j];
			result[j] = result[n-1];

			result[i] = '(' + expa + '+' + expb + ')';      //任取的两个数在“+”运算符下的结果
			number[i] = a + b;                              //将该运算符下的运算结果放入数组中
			if(PointsGame(n - 1))
				return true;

			result[i] = '(' + expa + '-' + expb + ')';      //任取的两个数在“-”运算符下的结果
			number[i] = a - b;
			if(PointsGame(n - 1))
				return true;

			result[i] = '(' + expb + '-' + expa + ')';      //任取的两个数在“-”运算符下的结果
			number[i] = b - a;
			if(PointsGame(n - 1))
				return true;

			result[i] = '(' + expa + '*' + expb + ')';      //任取的两个数在“*”运算符下的结果
			number[i] = a * b;
			if(PointsGame(n - 1))
				return true;
			if(b != 0)
			{
				result[i] = '(' + expa + '/' + expb + ')';  //任取的两个数在“/”运算符下的结果
				number[i] = a / b;
				if(PointsGame(n - 1))
					return true;
			}
			if(a != 0)
			{
				result[i] = '(' + expb + '/' + expa + ')';  //任取的两个数在“/”运算符下的结果
				number[i] = b / a;
				if(PointsGame(n - 1))
					return true;
			}
			number[i] = a;    //将刚开始任取的两个数重新放回数组中对应的位置
			number[j] = b;
			result[i] = expa;
			result[j] = expb;
		}
	}
	return false;
}

int main(void)
{
	int i,x;
	for(i = 0; i < CardsNumber; i++)
	{
		char buffer[20];
		cout << "Please input the " << i+1 << "th number:";
		cin >> x;
		number[i] = x;            //保存输入的4个整数的浮点型数组
		itoa(x, buffer, 10);      //把输入的4个整数按10进制转化为字符串
		result[i] = buffer;
	}
	if(PointsGame(CardsNumber) )
	{
		cout << "Success." << endl;
	}
	else
	{
		cout << "Fail." << endl;
	}
	system("pause");
	return 0;
}

运行效果图如下:

 


 

24点游戏算法 题目描述:问题描述:给出4个1-10的数字,通过加减乘除,得到数字为24就算胜利输入描述:输入4个int整数输出描述:返回能否得到24点,能输出true,不能输出falseimport java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanne... 阅读详情

相关推荐

c语言递归解24点游戏

c语言使用递归解24点游戏的小程序,程序中有一个小缺陷,但基本的算法是正确的

24点递归实现(c语言)

一、 24点规则介绍 24点是棋牌类益智游戏,要求四个数字通过加、减、乘、除运算,最终结果等于二十四。下面要求编写一个程序,随意输入四个数,能够判断这4个数是否能计算出24点。 二、 递归算法原理 由于用循环穷举4个数的排列组合的方法时间复杂度较高,所以想到了递归。四个数的运算必定有两个数先进行运算,那么剩下的相当于是两个未运算的数与一个运算结果,可以看成是从四个数任意挑两个数进行运算变成了三个数任意挑两个数进行运算。这就实现了递归的其中一步,迭代之后只剩下一个数时就是...

weixin_65089713的博客 5907

24点算法实现

给定4个整数,其中每个数字只能使用一次;任意使用 + - * / ( ) ,构造出一个表达式,使得最终结果为24,这就是常见的算24点的游戏。这方面的程序很多,一般都是穷举求解。本程序通过递归算法实现实现24点计算,

c语言四个零,输入任意四个整数(0到10),运算符只有加减乘除,还有括号.每个数只能且必须用一次。要求判断这些表达的结果中是否有24。如果有,输出计算表达式:如输入4,6,1...

已结贴√问题点数:20回复次数:5 输入任意四个整数(0到10),运算符只有加减乘除,还有括号.每个数只能且必须用一次。要求判断这些表达的结果中是否有24。如果有,输出计算表达式:如输入4,6,1输入任意四个整数(0到10),运算符只有加减乘除,还有括号.每个数只能且必须用一次。要求判断这些表达的结果中是否有24。如果有,输出计算表达式:如输入4,6,1,1 输出 4*6*1*1 =24 (允...

weixin_28676973的博客 805

DCDC: 前馈电容优化环路稳定性的设计与验证方法

本文深入探讨了DCDC转换器中前馈电容对环路稳定性的优化设计与验证方法。通过分析前馈电容的作用原理、选型计算和实验验证,详细介绍了如何利用穿越频率和相位裕度等关键参数提升系统性能。文章还提供了实用的设计经验和问题排查技巧,帮助工程师在实际应用中实现DCDC转换器的最佳稳定性。

weixin_42531516的博客 438

Axure RP9 利用中继器实现列表数据的切换,分页器数据的动态交互加载

Axure RP9 利用中继器制作分页组件 在原型制作中,如何实现分页数据的动态加载、分页与数据的交互,每页显示条数的设定。下面通过制作五年级一班成绩单分页列表,分享给大家,适合有一定axure使用基础的人员,如有更好的方案,请多多指教。 最终效果图: 步骤1:首先利用中继器画出成绩单列表,并绑定成绩单数据。 步骤2:画出每页显示条数控制下拉框,利用中继器画出分页组件 步骤3:新增全局标量maxpage(显示的最多页码),minpage(显示的最小页码),i(循环计数),j(最循环数),selectpa

shandongmike的博客 6819

unity里面的一套简单buffer和技能

unity里面的一套简单buffer和技能。

478

ROS2学习笔记(二)-- 多机通讯原理简介及配置方法

简单介绍ROS2多机通信原理以及配置注意事项

aibingjin的博客 1万+

​​​​​​​24点游戏

目录 24点游戏 背景 目的 这是该游戏的接口 接口的实现 测试程序 实现效果 24点游戏 棋牌类益智游戏,要求四个数字经过算术运算结果等于24. 这个游戏可以利用扑克牌进行(可以抽去大小王和花牌,留下40张数字牌), 然后从牌中随机抽取4张牌,用加、减、乘、除(也可以用括号,开方乘方等数学运算) 将抽出的四张牌的数字计算成24。 [24点](https://baike.baidu.com/item/24%E7%82%B9/6433670?fr=aladdin) 四张牌必须使用..

m0_47585722的博客 1826

cpp中auto, auto &和const auto &的区别

笔者初学cpp,如有纰漏,请见谅并指正。 用在哪 auto用于推断类型,具体可用于声明变量时根据初始化表达式自动推断该变量的类型,也就是可用在for循环。 也可以用于声明函数返回值的占位符。 怎么用 这里主要讲for循环中三者的区别 直接说结论 auto auto用于copy一份集合中的数据,对于这种情况,在循环体中不论怎么修改copy的数据,是不会影响到原有集合中的数据的。 举个简单的例子 int arr[5] = {0, 1, 2, 3, 4}; cout << "使用auto" <&

NinoSun的博客 3176

120、ISP 驱动架构解析:从 V4L2 请求到 ISP 硬件的配置下发流程

本文以实际案例解析ISP驱动架构的V4L2到硬件配置下发流程。作者通过一个因内存共享导致画面闪烁的bug案例,详细剖析了用户空间参数通过V4L2结构体传递、驱动层拆包与硬件寄存器映射、时序同步机制等关键环节。特别强调深拷贝、dirty flag增量更新、shadow register等实现要点,并给出多路并发隔离、寄存器写入失败等典型问题的排查方法。文章建议开发者深入理解参数到寄存器的转换过程,推荐通过debugfs实时监控寄存器状态,避免过度依赖自动调试工具。全文以实践为导向,对ISP驱动开发具有直接指导

sundong_81的博客 159

面:24点游戏

输入4个数,求解得到24点,并输出相应的表达式。 使用面向对象开发,只能用整形,比如输入6 6 6 6 ,则输出6+6+6+6=24 测试的时候我会用3 3 8 8,也可能会有5 5 5 1 来测试 3 3 8 8(((3+8)/3)*8) = 24 3,3,8,8算24点的算法有: 1,8/(3-8/3)=24 2,8/(3-(8/3))=24 8÷(3-8÷3...

hunter 775

XYC Q8开源掌机刷第三方系统教程

分区结束后直接将各种游戏文件放入OD分区的Roms文件夹下

m0_60352504的博客 4569

24点游戏(python)

messagebox.showerror("错误", f"计算结果为 {result},不等于24")messagebox.showinfo("答案", f"一个可能的解法:{self.solution}")messagebox.showerror("错误", "请只使用给定的数字!messagebox.showerror("错误", "请输入有效的算式!messagebox.showinfo("恭喜", "答案正确!messagebox.showinfo("答案", "这组数字无解!

a53347809的博客 1553

【学习系列】SAP RAP 7:行为定义-Draft

本文介绍了RAP框架中的草稿表(Draft)功能及其应用。草稿表允许用户临时保存数据,在激活前不影响业务逻辑,支持保存继续、暂存和设备切换功能。草稿分为独占草稿(仅限同一用户编辑)和协作草稿(允许多用户协同编辑)。启用草稿需在行为定义和投影中包含标准action,并创建包含TotalETag等管理字段的草稿表。TotalETag确保草稿转换时活动数据未被修改,而ETagmaster则防止并发修改。文章通过OData调用示例详细说明了ETag验证过程,强调草稿功能由RAP框架自动处理,开发者只需关注定义和配置

DeveloperMrMeng的博客 443

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

24点纸牌游戏

24点纸牌游戏 第3章 24点游戏是经典的纸牌益智游戏。 常见游戏规则: 从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。 基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。 1.程序风格良好(使用自定义注释模板) 2.列出表达式无重复。 算法设计思路:对牌的顺序、括号位置、可能的运算符穷举,直到找到解法 知识

ha______haha的博客 597

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

24点小游戏游戏

24点游戏是经典的纸牌益智游戏。 常见游戏规则: 从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。 一:基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。 1.程序风格良好(使用自定义注释模板) ...

qq_43407321的博客 439

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

python24点游戏

使用python来玩24点游戏。

weixin_47552266的博客 1308
上一篇: 移数字游戏
下一篇: 面试题
hackbuteer1
博客等级 码龄15年 1万+粉丝 251原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值