1. 河内(河内)塔——1883

河内塔游戏是最美观的游戏之一,由法国数学家爱德华·卢卡斯于1883 年发明。

这个游戏起源于一个传说:本纳尔斯有一座雄伟的宫殿。宫殿内有一块黄铜板,上面插着三根大针。一开始,64个黄铜圆盘按从大到小的顺序放在一根大针上,最大的圆盘在底部。无论白天还是晚上,牧师都会以相同的速度将圆盘从一根大针转移到另一根大针上,并且不允许在较小的圆盘之间放置圆盘。优越的。当圆盘塔在另外两根针中的一根上重建时,宇宙就会终结。

即使这个传说是真的,也没有理由担心。即使每秒移动一个圆盘,也需要6000亿年才能完成这项工作,大约是太阳寿命的60多倍。在较少数量的圆盘上完成汉诺塔所需的必要步骤是2n-1。因此,两个圆盘需要三个步骤,三个圆盘需要七个步骤,依此类推。

河内塔

2. 算法分析

卢卡斯著名的拼图,源自河内塔游戏,后来被制成儿童玩具。这是一个非常巧妙的玩具模型,充分利用了几何指数级数的概念。即使在今天,这个拼图的许多版本仍然可以在世界各地的玩具店找到。

转移三个硬币或圆盘需要7 个步骤。要转移四个,需要15 个步骤。要转移5 个,需要31 个步骤。要转移6 个,需要63 个步骤。要转移n,需要2n-1步。卢卡斯难题的解决方案似乎很难找到,因为某些步骤很容易出错。

我们可以得到有关这些解决方案的一些可能的提示:

1. 将最小的磁盘从现有的卡槽移至隔壁的一列,使其始终处于相同的循环顺序。

2. 之后,移动除最小磁盘之外的其他磁盘。这个规则可能看起来很武断,但你会发现你总是可以采取合理的步骤,直到谜题突然以神奇的方式解决(不一定是最少的步骤)。

解决这个难题是递归算法的一个经典例子。

以4盘为例,见下图。我们先把中间一列的4-1=3个圆盘移到左边的转移列上,需要23-1=7步,然后移动最下面的一个大圆盘放在右边的目标列上,然后移动将传送柱上的4-1磁盘转移到目标柱上。中置方式有7种,总共7+1+7=15种方式。当放置3个磁盘时,您可以在传输中递归地先放置3-1.

3. 使用Scratch编程实现Ivan Moskovich书中给出的汉诺塔谜题的三种解决方案。

【解决方案1——列表方法】

如果不考虑将运动过程实时显示在屏幕上,那就很简单了。只需创建一个列表“步骤列表”并将每个运动过程的符号放入列表中即可。

构建递归子程序,首先以转移列C为目标列,转移n-1个磁盘;其次,将A列中的圆盘放入B列中,并将移动轨迹符号添加到列表中;然后以C柱为源柱,B柱为目标,C柱上的n-1个盘被转移。

列出方法过程和结果

【2——动画显示列表确定位置方法的解决方法】

此方法的难点在于为舞台上每个圆盘的运动制作动画。这里有一个问题。如果n个磁盘数量很大,是否需要创建n个磁盘字符?在这种情况下,程序会更加复杂。很自然地,我就想到了使用克隆功能。但如何让每个分身按照要求行动呢?需要确定哪个克隆应该移动以及移动到该列上的哪个位置?

与方案一的脚本相比,将原始角色存储到列表中的动作改为移动盘子的过程,在舞台上动态显示。

刮刮模拟《迷人的数学》 谜题189—— 河内塔(汉诺)游戏

为此,我们需要创建一个额外的板块角色。根据盘子的数量,我们可以像孙悟空一样,制作N个盘子的克隆体(克隆)来充当那些盘子。每个克隆都有一个身份标签,它是私有变量“磁盘名称(私有更改)”的值,即字符“磁盘x”,其中x是序列号。

让主控程序使用递归来确定将哪一列的盘子移动到另一列。

那么圆盘应该移到起始柱上的什么位置呢?目的地支柱的哪个位置是接收位置?这需要做一些必要的计算。为此,我们需要创建3 个列表:支柱1、支柱2、支柱3。在第一个列表(支柱1)中,板的序列号从上到下放置。接下来的两个列表中,首先放置了N个零,表示为空。当需要在里面某个位置放一块盘的时候,把这个位置的内容替换成该盘的编号,这就是“盘名(私改)”。以下是“Plate”角色初始设置的脚本:

初始化程序

以下是“大师”角色的递归算法程序。与方案一的区别在于: 1、将列码A、B、C替换为1、2、3,以方便后续程序的编写。

汉诺塔递归算法子构建块

2.关键模块“盘子从起始列移动到目标列”的内容比解决方案1复杂得多。因为这不仅仅是标记一个字符的问题。有6种情况需要区分。

实现从起始栏到目标栏的盘子的脚本

将小节1 移动到小节2 的脚本

如何计算算法“12”?

在起始栏对应的列表中,从上到下第一个不为0的位置的车牌应该被移动,并将这个非0值(车牌号)放入“移动车牌号”中(这是一个克隆(plate)是是否移动的关键信号),移动后,应立即将这个非零值改为0,使其成为可接收的位置。

在对应的目标柱列表中,从下到上第一个k为0的位置为接收位置。由于有车牌过来,所以这里的列表内容要从0改为即将到来的车牌号。

我们以“12”为例。其他五个原则都是一样的,只是轮换一下而已。

有兴趣的读者可以尝试编写其他五个子模块。

做好这些准备工作后,就可以在舞台上布置柱子和盘子了。

绘制下图作为舞台背景。三个柱子的下坐标分别为(-160,-150)、(0,-150)和(160,-150)。角色“盘子”的形状是椭圆形。

图6-17 背景与车牌人物建模

“盘子”角色分别收到相关消息后的动作脚本

移动动作分为三步:1.在起始列上移动到该列的顶部,2.平移到目标列的顶部,3.向下移动到目标位置:

克隆板动作

单击绿旗,输入板数并按Enter。盘子堆放在左列上。再次按空格键,盘子就会以正确的方式移动!不过如果盘子数量较多的话,时间就更长了!当然,如果你把速度设置得更快的话,你肯定会比加速模式下的那些牧师快很多!

刮刮模拟《迷人的数学》 谜题189—— 河内塔(汉诺)游戏

移动进程片段

【3——动画显示解决方案:触摸颜色确定位置】

可见,方法2的确定位置的算法相对复杂。有没有更简单的方法?

我们可以充分利用Scratch的检测功能,用两种颜色来区分板材字符的表面和边缘。每次放置一个盘子时,它会从上到下移动,直到碰到盘子的颜色或到达底部位置(使用角色的y坐标这个私有变量值判断)才会停止,并进一步向下移动一点,确保下板(如果有)接触到自己的边缘颜色就可以了。这消除了计算的需要,并让检测自动完成。

板材堆垛子程序

那么每个克隆如何知道它是否应该移动以及以什么方式移动呢?这里可以使用另一个私有变量“action”来区分,让克隆根据当前的方式和位置来确定自己的位置,包括它在哪一列以及是否是最上面的一列。这取决于克隆是否接触板。从边缘颜色来看,因为触摸它就意味着上面有一个盘子。

根据模式私有变量“action”的值生成实际操作的程序

确定移动方式的流程与方案2大致相同

模式选择主控子块

根据选择确定私有变量的“操作值”的程序

主程序和递归子程序

动画剪辑

4. 资料片:巴比伦游戏

该游戏是经典河内塔游戏的衍生游戏。您可以选择不同的难度级别,下面给出了一些示例。

如图所示,左边的卡槽里堆放着一些光盘。每个游戏的目标是以相同的顺序将这些棋子转移到右侧。编号最大的圆盘应放置在卡槽的底部。

这四个游戏的目标是将3、4、5、6张棋盘按照相同的顺序转移到右侧的卡槽中。数字最大的圆盘放在底部。离顶部越远,圆盘的数量越小。请记住遵守以下规则:

1. 一次只能移动一张光盘。

2. 不要将任何磁盘放置在编号小于其编号的磁盘之上。

3、可以使用中间的卡槽,但需要遵守第1条和第2条的规定。

您需要采取多少步骤才能完成此类转移?您可以尝试完成第一个游戏,然后继续进行更困难的游戏。

用户评论

念旧是个瘾。

哇,河内塔游戏真是经典!每次玩都感觉智商提升了,这个模拟做得不错。

    有18位网友表示赞同!

未来未必来

《迷人的数学》这个系列太棒了,这个河内塔游戏做得很有趣,让我想起了小时候。

    有14位网友表示赞同!

封锁感觉

河内塔游戏确实挺有意思的,不过感觉刮刮模拟有点复杂,新手可能不容易上手。

    有20位网友表示赞同!

一别经年

数学游戏能做得这么吸引人,真是厉害!谜题189的河内塔游戏,我一定要试试。

    有15位网友表示赞同!

墨城烟柳

这个游戏的设计很有创意,河内塔的谜题难度适中,适合各个年龄段的人。

    有19位网友表示赞同!

裸睡の鱼

数学一直是我的弱项,但这个游戏让我对数学有了新的认识,感觉挺有意思的。

    有6位网友表示赞同!

清羽墨安

河内塔游戏太考验耐心了,每次失败都让我想放弃,但最终还是坚持下来了。

    有7位网友表示赞同!

墨染年华

谜题189的河内塔游戏,我觉得对提高逻辑思维能力很有帮助,推荐给大家。

    有7位网友表示赞同!

蹂躏少女

刮刮模拟的《迷人的数学》系列,每次都有新的惊喜,河内塔游戏也不例外。

    有16位网友表示赞同!

还未走i

河内塔游戏真的很有挑战性,每次成功解决一个谜题都很有成就感。

    有7位网友表示赞同!

幸好是你

这个游戏让我想起了大学时的数学课,虽然有点难,但我觉得很有趣。

    有6位网友表示赞同!

别伤我i

河内塔游戏虽然简单,但要想玩好并不容易,需要一定的耐心和策略。

    有8位网友表示赞同!

煮酒

谜题189的河内塔游戏,我觉得适合作为亲子游戏,既能锻炼大脑,又能增进感情。

    有10位网友表示赞同!

漫长の人生

刮刮模拟的《迷人的数学》系列,真的让我对数学产生了浓厚的兴趣。

    有13位网友表示赞同!

如你所愿

河内塔游戏让我体会到了数学的魅力,这种游戏方式真的很有创意。

    有13位网友表示赞同!

陌然淺笑

每次看到河内塔游戏都想去挑战,但总是被自己的智商打败,哈哈。

    有20位网友表示赞同!

残留の笑颜

数学游戏能做得这么有趣,真的让人意想不到,给设计师点个赞!

    有5位网友表示赞同!

眼角有泪°

河内塔游戏让我重新认识了数学,感觉数学原来也可以这么好玩。

    有13位网友表示赞同!

安陌醉生

这个游戏的设计很用心,河内塔的谜题难度适中,非常适合我这种数学小白。

    有16位网友表示赞同!

标签: