2022年 11月 8日

汉诺塔(python)实现

汉诺塔问题: 古代有一个梵塔,塔内有三个基座,A,B,C,开始时A基座上有64个盘子,盘子的大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A基座上移动到B基座上,但每次只允许移动一个盘子,且在移动过程中,3个基座上的盘子都始终保持着大盘在下,小盘在上。移动过程中可以利用C基座做辅助。

此问题又被称为“世界末日问题”,因为以最高效的移动(无不必要的移动)方法,以每秒移动一次的速度,64 个盘子也需要近580亿年的时间。

'''
算法:大规模转化为小规模问题,把上面的n-1个盘子看做一个小盘子,那就只有两个盘子,转化成移动两个盘子的问题。
    第一步:把上面n-1个盘子借助B基座先移动到C基座上
    第二步:把最底下那个盘子移动到B基座
    第三步:再把C基座上的n-1个盘子借助A基座移动到B基座上
    
    记作hanoi(n,a,b,c):a,b,c不代表固定的基座,根据移动次数变化
        n:问题的规模,盘子的个数
        a:代表每次移动时的起始基座
        b:代表每次移动时的终点基座
        c:代表每次移动时的辅助基座
        
    则此问题的步骤:
        第一步:hanoi(n-1,a,c,b)
        第二步:把最下面的那个大盘子从起点基座移动到终点基座
        第三步:hanoi(n-1,c,b,a)
'''

def hanoi(n,a,b,c):
    if n > 0:
        hanoi(n-1,a,c,b)
        print("%d号盘子:%s ----> %s" %(n,a,b))
        hanoi(n-1,c,b,a)

def main():
    n = int(input("请输入n的值:"))
    hanoi(n,"A","B","C")

if __name__ == "__main__":
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

运行结果:

请输入n的值:3
1号盘子:A ----> B
2号盘子:A ----> C
1号盘子:B ----> C
3号盘子:A ----> B
1号盘子:C ----> A
2号盘子:C ----> B
1号盘子:A ----> B
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8