LeetCode-漢諾塔問題

鏈接:https://leetcode-cn.com/problems/hanota-lcci
在經典漢諾塔問題中,有 3 根柱子及 N 個不同大小的穿孔圓盤,盤子可以滑入任意一根柱子。一開始,所有盤子自上而下按升序依次套在第一根柱子上(即每一個盤子只能放在更大的盤子上面)。移動圓盤時受到以下限制:
(1) 每次只能移動一個盤子;
(2) 盤子只能從柱子頂端滑出移到下一根柱子;
(3) 盤子只能疊在比它大的盤子上。
請編寫程序,用棧將所有盤子從第一根柱子移到最後一根柱子。
解題思路:遞歸與分治
n = 1 時,直接把盤子從 A 移到 C;
n > 1 時,
先把上面 n - 1 個盤子從 A 移到 B(子問題,遞歸);
再將最大的盤子從 A 移到 C;
再將 B 上 n - 1 個盤子從 B 移到 C(子問題,遞歸)。

class Solution:
    def hanota(self, A: List[int], B: List[int], C: List[int]) -> None:
        n = len(A)
        self.move(n, A, B, C)
    # 定義move 函數移動漢諾塔
    def move(self,n, A, B, C):
        if n == 1:
            C.append(A[-1])
            A.pop()
            return 
        else:
            self.move(n-1, A, C, B)  # 將A上面n-1個通過C移到B
            C.append(A[-1])          # 將A最後一個移到C
            A.pop()                  # 這時,A空了
            self.move(n-1,B, A, C)   # 將B上面n-1個通過空的A移到C
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章