【汉诺塔】汉诺塔最小步数问题的推理过程及实践
前文
因为原神的珐露珊邀约才知道了这个小游戏,当时就花了一点时间进行数学推理,感觉有点意思就做了一个类似于攻略的东西出来。可能已经有人做过更好更易懂的攻略了,不过以下内容是我在游玩过程中自己的思考,所以我还是决定把它写下来。
如果不想看那么长的文字过程可以直接跳转到下方红字处看结论。玩法和演示过程就放在视频里了,感兴趣的可以点击下方链接跳转观看(记得看视频简介)↓
【原神/堆栈塔】珐露珊邀约7层汉诺塔最少步数解法演示(附9层塔)
数学推理过程
假设有n个圆环,将n个圆环移动到另一根柱子的最少步数为aₙ。圆环从上到下依次编号,记为1、2、3……n-1、n;三根柱子从左到右分别记为A、B、C。
这边我们默认圆环初始的位置在A柱,圆环移动后的最终位置为B柱(这边为了方便讨论就以上述条件为基准,实际选择不同的标定物对推理并没有影响)
接下来我们进行分类讨论:
①当n=1时
将1个圆环移动到另一根柱子(B柱)的步数为1,即a₁=1
②当n≥2时
由于n号圆环(最大)下方不可能有其它圆环,所以整个流程中我们只需要移动一次即可。首先我们构想一个场景,在我们移动的过程中,若想把处于A柱上的n号圆环移动到B柱,就需要保证1~n-1号圆环依次从上到下处于C柱才能实现(此时B柱上无圆环)。
有了这个前提,将n个圆环移动的过程就可以拆分成三个阶段:
Ⅰ:将1~n-1号圆环从A柱移动到C柱
Ⅱ:将n号圆环从A柱移动到B柱
Ⅲ:将1~n-1号圆环从C柱移动到B柱
这里我们也可以看出Ⅰ、Ⅲ阶段的本质就是将1~n-1号圆环从一根柱子移动到另一根柱子上,其需要的最小步数皆为aₙ₋₁,共计2aₙ₋₁步。
因此可得aₙ=2aₙ₋₁+1
等式左右两边+1可得
aₙ+1=2aₙ₋₁+2=2(aₙ₋₁+1)
(aₙ+1)/(aₙ₋₁+1)=2
由此可知数列{aₙ+1}是以2为首项以2为公比的等比数列,所以aₙ+1=2ⁿ,aₙ=2ⁿ-1
从而我们得出移动n个圆环组成的塔所需的最少步数满足aₙ=2ⁿ-1这个关系式。
实践操作
了解了移动原理之后我们要做的就是实现如何用最少的步数完成移动。
我们假设正在进行n层塔的移动(n>1),移动n层塔被我们拆分成了三个阶段:
Ⅰ:将1~n-1号圆环从A柱移动到C柱
Ⅱ:将n号圆环从A柱移动到B柱
Ⅲ:将1~n-1号圆环从C柱移动到B柱
我们首先要完成Ⅰ阶段,这时底部的n号圆环就不需要移动,我们可以将其忽略不计,问题就转化为将n-1层塔移动到另一根柱子,那么Ⅰ阶段就可以继续拆分成三个新的阶段:
Ⅰ:将1~n-2号圆环从A柱移动到B柱
Ⅱ:将n-1号圆环从A柱移动到C柱
Ⅲ:将1~n-2号圆环从B柱移动到C柱
我们按照这个思路再单独取出新的Ⅰ阶段进行拆分可得:
Ⅰ:将1~n-3号圆环从A柱移动到C柱
Ⅱ:将n-2号圆环从A柱移动到B柱
Ⅲ:将1~n-3号圆环从C柱移动到B柱
按照这个思路不断拆分至第一层可得第1层圆环的摆放位置,也就是第一步移动的摆放位置
PS:这里确定第一层的摆放位置是因为我们已经选定了B柱为目标柱(移动后的结果),此基础下塔总层数为奇数或偶数会导致无法实现最少步数移动。实际情况中目标柱可凭玩家喜好而定,故不用考虑这个。
同理,我们将Ⅲ阶段不断拆分后即可得到实现最少步数的每一步,再把各阶段加起来就是一份完整的“参考答案”了。理论上来讲,这种方法可以计算出每一步的移动方向并精确说明。
而拆分过程中可以得出一个规律:
当我们移动第x层圆环时
①x为奇数,则需要将该圆环放在偶数层圆环的上面,倘若无偶数层圆环则放在空柱(没有任何圆环的柱子)上。
②x为偶数,则需要将该圆环放在奇数层圆环的上面,倘若没有层级大于x的奇数层圆环,则放在空柱上。
此规律可用于确认当前的移动进度(任何时候都适用),可避免层数或步骤太多导致大脑无法处理信息的情况。
PS:此规律为个人概括,并不具有权威性,不过我概括完多次尝试后也没找出什么明显的问题,如果有误后续会纠正的。
总结
本来我想把详细而完整的推理过程给写下来的,但是表达能力实在有限,所以证明这个规律的过程没有详写,而且写了的内容也可能比较抽象(对不起!)。在明白移动的原理后,更多依靠的还是自己的经验,熟练度上来后游戏的规律和技巧可能就在潜移默化中得到了理解。游戏上手难度本身并不大,哪怕不看这些也没有任何影响,写这些也只是因为我想用文字将抽象的东西化为具体的问题来解释说明,而不是凭借着感觉和经验来完成它。当然写完后我才感觉有点多此一举了,不过这时候后悔也没什么用了(哭)。Ⅲ阶段的拆分过程没有写是因为我实在是写不下去了了,浪费时间又浪费精力,反正方法跟Ⅰ阶段一模一样,我想应该是能够理解的吧×。
草草地写完了这篇文章,若有什么错误的地方还请各位指出。感谢观看。