zoukankan      html  css  js  c++  java
  • 汉诺塔

    '''
    问题:
        有三个柱子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')
  • 相关阅读:
    Linux内核的总结认识
    服务器的基本问题避免
    Linux中多线程信号的处理
    gdb调试
    TCP数据包的封包和拆包
    网络TCp数据的传输设计(黏包处理)
    InputArray和OutputArray
    UTF8转unicode说明
    C++使用标准库的栈和队列
    resize函数有五种插值算法
  • 原文地址:https://www.cnblogs.com/staff/p/11403341.html
Copyright © 2011-2022 走看看