汉诺塔,又称河内塔,根源是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,他要求庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面,等64个金片全部移动到第三个柱子,世界将在一声霹雳中毁灭,而梵塔、庙宇和众僧也逃无可逃。设每秒能搬一个,但还是需要18446744073709551615秒,看来,众僧们耗尽毕生精力也不可能完成金片的移动,宇宙也不会保存这么长时间。
三阶汉诺塔简易示意图:
后来,这个传说故事逐渐演变为汉诺塔游戏。
游戏规则很简单:
1、有三根柱子A,B,C,A上有若干盘子。
2、每次只能移动一个盘子,小的盘子只能叠在大的上面。
3、将所有盘子移动到从A移动到C上。
汉诺塔问题其实不是很难,它还是程序设计中的经典递归问题。
如三阶汉诺塔移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C。
输入:
一个整数N,表示A上有N个盘子。
输出:
若干行,即移动步骤。
例:
输入
3
输出
A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C
思路:如果有n个盘子,现将n-1个盘子借助C移动到B,然后把最大的盘子移动到C,最后借助A把n-1个盘子移动到C。
详细步骤示意图:
代码:
n=int(input())
def hanno(n, a, b, c):
'''汉诺塔问题'''
if n == 1:
print(a, '-->', c)#大的移动到c
else:
hanno(n - 1, a, c, b)#n-1个碟子移动到B
print(a, '-->', c)
hanno(n - 1, b, a, c)#n-1个碟子移动到C
print(hanno(n,'A','B','C'))
(完)