汉诺塔

試著忘記壹切 提交于 2019-11-28 08:58:55

 

 

'''
问题:
    有三个柱子A、B、C。移动n个盘子从 A -> C
分析:
    步骤1: 移动前n-1个盘子 A -> B
    步骤2: 移动第n个盘子 A -> C
    步骤3: 移动前n-1个盘子 B -> C
实验:
    (n个盘子从上到下编号:1, 2, 3,...,n)
    n=2:
        move 1 A -> B  步骤1:移动前n-1个盘子 A -> B
        move 2 A -> C  步骤2:移动第n个盘子到 A -> C
        move 1 B -> C  步骤3:移动前n-1个盘子 B -> C
    n=3:
        move 1 A -> C
        move 2 A -> B
        move 1 C -> B  移动前n-1个盘子 A -> B
        move 3 A -> C  移动第n个盘子到 A -> C
        move 1 B -> A
        move 2 B -> C
        move 1 A -> C  移动前n-1个盘子 B -> C
    n=4:
        4 A C
        3 A B
        4 C B
        2 A C
        4 B A
        3 B C
        4 A C
可以看到,
要把盘子A->B 要通过C,
把盘子从B->C要通过A
def move(n, start,end, middle)
    move n   start -> middle
    move n-1 start -> end
    move n   middle-> end
    if n==1:
        move 1 A -> C
    move(n, 'B', 'C', 'A')
'''


# def move(n, A, B, C):  # 从A -> B通过C
#     print('move %d %s -> %s' % (n, A, C))
#     print('move %d %s -> %s' % (n - 1, A, B))
#     print('move %d %s -> %s' % (n, C, B))
#     n -= 1
#     if n == 1:
#         return
#     move(n, B, C, A)  # 从B -> C通过A
# move(3, 'A', 'B', 'C')
def hanoi(n, a, b, c):
    if n == 1:
        print(n, a, '-->', c)  # 移动第n个盘子到 A -> C
    else:
        hanoi(n - 1, a, c, b)  # 移动前n-1个盘子 A -> B 通过 C
        print(n, a, '-->', c)
        hanoi(n - 1, b, a, c)  # 移动前n-1个盘子 B -> C 通过 A
# 调用
hanoi(3, 'A', 'B', 'C')

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!