问题描述:
汉诺塔游戏,现在有ABC三根柱。要求:将A柱所有的圆盘放到C柱。在移动的过程中可以借助B柱。并且规定大圆盘不能放小圆盘上,每次只能移动一个盘子。用递归的方式来解决汉诺塔问题。
解题思路:
- 假定最上面是第一层为1号圆盘,简称1号,最下面一层最大第n层为n号圆盘,简称n号
- 需要先将n-1层按规则移到B柱,即B柱从上到下为 1号、2号、… 、n-1号,C柱空出,A柱只剩下最大的n号一个
- 然后A柱的第n层n号,移到C柱上,再将B柱的1——n-1号按规则,移到C上,完成移动
- 当只有1层时,将A柱1号,移到C柱,完成
- 当只有2层时,先将A柱1号,移到B柱,A柱2号移到C柱,然后,将B柱1号移到C柱,完成
- 当只有3层时,先将A柱1号,移到C柱,A柱2号移到B柱,然后,将C柱1号移到B柱,这样就将n-1层全部移动了B柱,A柱只剩下n号(即3号),C柱空出。
- 当有4层时,将前3层称到B注,把C柱空出来,即将1号称到B柱,直到n-1层全部移到B柱。
- 如此循环搬运即可完成n层汉诺塔移动。
- 由此可以推导出两个结论:
- n层汉诺塔至少需要移动 (2^n) -1 次
- 1层 需要 1次 (2^1)-1
- 2层 需要 3次 (2^2)-1
- 3层 需要 7次 (2^3)-1
- 4层 需要 15次 (2^4)-1
- 5层 需要 31次 (2^5)-1
- …
- 奇数层:最上面一层1号最先移动到C柱,可确保 n-1 层全部移到B柱;偶数层:最上面一层1号,最先移动到B柱,可确保 n-1 层全部移到B柱
- 完整代码如下: (如果转载,标明来源,谢谢!)
count1 = 0 # 计数器
def move(num1, a, b, c):
a_key = list(a.keys())[0]
b_key = list(b.keys())[0]
c_key = list(c