鏈接: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