python3:遞迴解漢諾塔問題

2020/2/28發表於2020-11-22

考研人資訊庫

此公眾號會發表計算機考研(初複試資訊)、夏令營等資料,方便考研人對資訊的獲取,節約自身查詢資料的時間,回覆408,可獲得資料結構、作業系統、計算機網路、計算機組成原理全科資料

問題

在經典漢諾塔問題中,有 3 根柱子及 N 個不同大小的穿孔圓盤,盤子可以滑入任意一根柱子。一開始,所有盤子自上而下按升序依次套在第一根柱子上(即每一個盤子只能放在更大的盤子上面)。移動圓盤時受到以下限制:
(1) 每次只能移動一個盤子;
(2) 盤子只能從柱子頂端滑出移到下一根柱子;
(3) 盤子只能疊在比它大的盤子上。

請編寫程式,用棧將所有盤子從第一根柱子移到最後一根柱子。

你需要原地修改棧。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/hanota-lcci
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

解題思路:遞迴與分治

    n = 1 時,直接把盤子從 A 移到 C;
    n > 1 時,
        先把上面 n - 1 個盤子從 A 移到 B(子問題,遞迴);
        再將最大的盤子從 A 移到 C;
        再將 B 上 n - 1 個盤子從 B 移到 C(子問題,遞迴)。

python3

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

 

相關文章