【编程|二十四点】关于编程解决二十四点的两种思路

article/2025/10/24 6:42:58

【编程心得系列*24点】

写在前面:编程心得系列不谈具体问题的代码,只谈解决思路。

这是一个关于二十四点的软件。属于典型的先有目的再有初衷的软件。

在此之前我倒是写过一个解数独的软件。但那个的核心代码部分毕竟是抄袭的。这次是觉得对自己更有信心,也是想就此考验一下最近的编程学习,因而,挑选了看上去不是而很有难度的24点作为突破点,以此来在实践中进一步学习。

 

二十四点问题

输入:四个数字

操作:以不同顺序和不同符号不断匹配,直到算得24点并输出。

输出:是否可以算得24点,若可以,输出方法。

很自然的我想到如下方法,书写一个等式:

A?B?C?D=24  (?对应的是不同运算符)

不停的替换ABCD和运算符,佐之以不同括号位置,直到算出二十点为止。

最开始困惑我的主要方面在于——运算优先级。如果加减乘除还有括号放在了一个公式中,那么排序优先级别就是我首先应该做的事情了。左一个括号,右一个括号,需要讨论的括号分类非常多,而每种分类又只对应了很少量的类别。这种分类价值显得很低,用起来让人很不愉快。而且,要实现一个运算优先级的算法,也不是一个简单的操作。

 

否定了自己思路的我查看了网上诸多解算24点的算法。这些算法质量层次不齐,其中大部分就是不断进行分类,多者甚至可以分出十多个类别。

实在不想费尽心思去学习别人那低劣的算法的我,终止了对此问题的探索。

 

方法一

后来我和朋友D君一起散步。说明我的困惑(带着吐槽的目的)。他说,你思考的方法不对,他说,我给你四个数字,你算一下24点。

他给的四个数字是:

4 3 4 4

我说,这有何难啊。3加4得到7, 7乘以4得到28,28减去4等于24。

接着D君说,你算的时候,要进行复杂的分类么?

 

聪明,我暗中夸奖他。下边是他提供的思路的归纳。

解决24点算法之——基数扩充法。

说明:在四个数字中挑选一个数,将之当成基数,不断对其加减乘除其他数来修改他,直到将之修改为24点。

所以,以循环图的方式表示此过程,如下图。

For(在四个数字中挑一个数字A)

For(挑选计算符号Z1)

   For(在剩下的三个数字中再挑一个数字B)计算result1=JiSuan(A,Z1,B);

     For(挑选一个计算符号Z2)

  For(在剩下的两个数字中再挑一个数字C)计算result2=JiSuan(result1,Z2,C);

   For(挑选一个计算符号Z3)

    For(选出最后的数字D){计算result3=JiSuan(result1,Z2,C);if(result3==24)输出;}

 

基数扩充法虽然好,但无法包含所有可能。还存在一种可能。例如1 2 3 5,那么解决这个问题的最好方式就是(1+2)*(3+5)。显然的,这儿要进行两个基数扩充。所以,方法与上边一样。(请读者自己思考,并像上边那样写出流程图)

 

这个算法解决该问题需要计算:

这个数字可以说是相当的小,计算机完全可以在1ms内完成这个操作。

 

方法二

第一种方法已经很好。但后来,与另一个朋友小Z聊天,他看了我的算法,摇头说道:你这个方法不好,不具有通用性。

小Z问我:

为什么一定要从一个数字开始到算出24为止?为什么不反过来?能否考虑一下分治法(一种循环迭代的算法)?

 

高明,我一拍手,整理出了思路。

问题:将N个数字进行加减乘除得到24。

步骤:1.将两个数字合并为一个新的数字。(共存在相加,相乘,除以,减去,被除,被减6种可能)

2.将N-1个数字加减乘除得到24。

#当N=2,可以直接判断

 

那么,这样解决这个问题的总的执行次数就是:

可以看到,比第一种算法略多一些。但对计算机而言,这个数字仍旧相当小。但这段算法可以解决N个数算24点的问题,更具有通用性。

算法如下:

 

解决24点算法之——分治法。

Get24(长度为N数组)

{

If(N==2)就反复套加减乘除,判断是否可以为24点,若可,则输出。

If(N!=2)就从中选出两个数字,合并为为一个新的数字,并倒入一个新的数组,N-1数组,并对之调用Get24(长度为N-1的数组);

}

 

 

最后是文末的一点总结。不得不感慨,一个好的算法真的是思维的火花。第一:开开脑洞,进行类比,换种方向思考,想想自己学习的数据结构知识。第二:对24点问题,还有其他问题,都要先想清楚思路,绘制好流程图然后再下手。第三:绝知此事要躬行。

望各位编程道路上的学习者不断总结,不断奋进。

 

2018.9.6

 


http://chatgpt.dhexx.cn/article/e5yIiyXX.shtml

相关文章

计算机二十四点游戏怎么玩,扑克牌二十四点怎么玩?扑克牌二十四点游戏规则介绍...

扑克牌二十四点是在国际上很流行的一种扑克游戏玩法,因为游戏计算性较强,较为考验的玩家的心算能力,所以很受扑克玩家的喜爱,那么扑克牌二十四点到底是怎么玩的呢?扑克牌二十四点的游戏规则又是什么呢?下面…

CCF计算机软件能力认证试题练习:201903-2 二十四点

二十四点 来源:CCF 标签: 参考资料: 相似题目: 背景 二十四点是一款著名的纸牌游戏,其游戏的目标是使用 3 个加减乘除运算使得 4张纸牌上数字的运算结果为 24。 题目 定义每一个游戏由 4 个从 1-9 的数字和 3 个四则运…

asdasdas

asdasdasdsadassad 阅读全文: http://gitbook.cn/gitchat/activity/5d634f8c5cbc425420e0e72f 您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。

dsada

图2.2 www.sina.com网站系统采用的基本上就是图2.2所示的架构,不同地区的人们在访问www.sina.com站点时,浏览器实际上所访问的服务器是不一样的,例如,吉林省的用户访问的服务器实际是sina放在吉林地区的代理服务器,湖北…

Asdasd

这里写阿阿萨德斯达四大自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义…

dsa-基础

算法与数据结构 0.概念数据结构复杂度时间复杂度空间复杂度 1. 线性表顺序表(数组)链表单链表双链表循环链表静态链表 顺序表/链表栈顺序栈链式栈 队列顺序循环队列链表队列双端队列 2. 递归递归与栈阶乘例子 3. 矩阵对称矩阵三角矩阵稀疏矩阵 4. 字符串 0.概念 数据结构 逻辑…

dsadas

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

DSDA 简介

参考link:千呼万唤,5G双卡双通到底有多重要?__财经头条 (sina.com.cn)

Java 排序算法:折半插入排序

有关排序的基本内容可以查看以下链接: 折半插入排序_360百科折半插入排序,折半插入排序(Binary Insertion Sort)是对插入排序算法的一种改进。所谓插入排序,就是不断的依次将元素插入前面已排好序的序列中。https://baike.so.com/doc/7028767-7251672.h…

Java排序算法——猴子排序(Bogo Sort)

此排序和之前介绍的三种排序没有任何关系,只是单纯在整理排序算法突然想到曾经看到过关于此排序的描述,现在总结一下。 之前三种排序的传送门开一下: 冒泡排序: Java排序算法——冒泡排序(Bubble Sort)ht…

java排序算法精讲

排序算法 概要一、冒泡排序概念实现步骤 代码 二、选择排序概念实现步骤 代码 三、插入排序概念实现步骤 代码 四、快速排序概念实现步骤 代码 五、归并排序概念实现步骤 代码 六、堆排序概念实现步骤 代码 总结以二维表表现出各个排序的关系 概要 Java是一种面向对象的编程语言…

Java排序算法(一):冒泡排序

冒泡排序 一、原理二、排序步骤三、实现代码四、复杂度分析 一、原理 冒泡排序是相邻的元素两两比较,把小的元素往前调或者把大的元素往后调,实现最大(小)值排列在一端。 注:相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法 …

十大经典排序算法(Java实现)

排序算法的重要性不言而喻,为了加深对这十种算法的理解,固写此文。 目录 1、冒泡排序(Bubble Sort)2、选择排序(Selection Sort)3、插入排序(Insertion Sort)4、希尔排序&#xff0…

Java排序算法——插入排序(Insertion Sort)

之前总结了交换排序的冒泡排序与选择排序的简单选择排序,这次我们来看看插入排序的简单插入排序~ 往期传送门: 冒泡排序: Java排序算法——冒泡排序(Bubble Sort)https://blog.csdn.net/babbfqb93/article/details/…

Java排序算法——冒泡排序(Bubble Sort)

冒泡排序是所有排序算法中最简单的一个排序,也是我个人学习的第一个排序方法,在这里重新进行一个总结。 冒泡排序(Bubble Sort)就如同其名称一样,水中的气泡由于压强的原因所以从下到上其大小也是从小到大&#xff0c…

Java排序算法——插入排序

Java排序算法——插入排序(Insertion Sort) 传送门 冒泡排序选择排序 简述 插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前…

Java实现排序算法

一、常见排序算法: 1、插入类排序: (1)直接插入排序 (2)希尔排序 2、选择类排序 (1)简单选择排序 (2)堆排序 3、交换类排序 (1)冒泡排序 (2)快速排序 4、归并排序 5、基数排序 二、内部排序:只考虑数据量较小仅需要使用内存的排序算法 三、…

Java排序算法——选择排序

Java排序算法——选择排序(Selection sort) 传送门 冒泡排序插入排序 简述 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放…