版权声明:本文为博主原创文章,遵循 CC 4.0 BY版权协议,转载请附上原文出处链接和本声明。
汉诺塔游戏玩法介绍(攻略和编程实现)
汉诺塔游戏介绍汉诺塔是根据一个传说形成的数学问题。描述如下:有三根杆子 A、B、C 。 A 杆上 N 个 穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至 C 杆:
每次只能移动一个圆盘大盘不能叠在小盘上面
可将圆盘临时置于 B 杆,也可将从 A 杆移出的圆盘重新移回 A 杆,但都必须遵循上述两条规则。问:如何移?最少要移动多少次?
最早发明这个问题的人是法国数学家爱德华·卢卡斯。传说越南河内某间寺院有三根银棒,上串 64 个金盘。寺院里的僧侣依照一个古老的预言,以上述规则移动这些盘子。预言说当这些盘子移动完毕,世界就会灭亡。这个传说叫做梵天寺之塔问题。但不知道是卢卡斯自创的这个传说,还是他受他人启发。
若传说属实,僧侣们需要 2 64 − 1 2^{64}-1264−1步才能完成这个任务,若他们每秒可完成一个盘子的移动,就需要 5849 亿年才能完成。整个宇宙现在也不过 137 亿年。
这个传说有若干变体:寺院换成修道院、僧侣换成修士等等。寺院的地点众说纷纭,其中一说是位于越南的河内,所以被命名为“河内塔”。另外亦有“金盘是创世时所造”、“僧侣们每天移动一盘”之类的背景设定。
递归解法
这个游戏,只要手机上下个 APP ,N 从小到大玩一会,也就知道其中的套路了。如果有一个盘,那么直接将这个盘从 A 挪到 C即可。如果有两个盘,需要先将小盘挪到 B,大盘挪到 C,再将小盘挪到 C,以此类推……
可以看到,解法的基本思想是递归。假设有 A、B、C 三个塔,A 塔有 N 块盘,目标是把这些盘全部移到 C 塔。那么先把 A 塔顶部的 N-1 块盘移动到 B 塔,再把 A 塔剩下的大盘移到 C,最后把 B 塔的 N-1 块盘移到 C。要先把 N-1 块盘挪到B,就需要先把 N-2 块盘挪到 C……如此递归地使用下去, 就可以求解。从这也可以看到需要总的步数为 2 N − 1 2^N-12N−1。
一个简单的 MATLAB 代码如下:
function hanoi2(n) %a上原有盘数为n的汉诺塔。 han(n,'a','b','c') functio