算法设计与分析— 汉诺塔问题(分治法)

算法设计与分析课程练习题:

汉诺塔问题(分治法)
在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制:
(1) 每次只能移动一个盘子;
(2) 盘子只能从柱子顶端滑出移到下一根柱子;
(3) 盘子只能叠在比它大的盘子上。
请编写程序,用栈将所有盘子从第一根柱子移到最后一根柱子。
你需要原地修改栈。

a) 算法思路
在这里插入图片描述
1、先推出表达式,将大问题一直分解成两个小问题
T(n)的大问题,分成T(n-1)两个小问题,再加上一步移动最底层的块。

def hanota(self, A, B, C):
    """
    :type A: List[int]
    :type B: List[int]
    :type C: List[int]
    :rtype: None Do not return anything, modify C in-place instead.
    """
    def move(n,A,B,C):
        if n==1:
            C.append(A.pop())
            return 
        move(n-1,A,C,B)
        C.append(A.pop())
        move(n-1,B,A,C)
    move(len(A),A,B,C)

时间复杂度:O(2^n)
空间复杂度:与递归层数相关

猜你喜欢

转载自blog.csdn.net/qq_39740279/article/details/121188962