码迷,mamicode.com
首页 > 其他好文 > 详细

汉诺塔

时间:2019-08-24 10:04:35      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:编号   else   start   return   pre   分析   ddl   问题:   style   

 

 

‘‘‘
问题:
    有三个柱子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)

 

汉诺塔

标签:编号   else   start   return   pre   分析   ddl   问题:   style   

原文地址:https://www.cnblogs.com/staff/p/11403341.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!