程式設計師面試金典 08 06 漢諾塔問題

2022-01-28 23:18:42 字數 917 閱讀 5827

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

(1) 每次只能移動乙個盤子;

(2) 盤子只能從柱子頂端滑出移到下一根柱子;

(3) 盤子只能疊在比它大的盤子上。

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

你需要原地修改棧。

示例1:

輸入:a = [2, 1, 0], b = , c = 

輸出:c = [2, 1, 0]

示例2:

輸入:a = [1, 0], b = , c = 

輸出:c = [1, 0]

提示:

a中盤子的數目不大於14個。

用遞迴的思想

將n個圓盤從a 通過b 移動到c

如果n=1,只有乙個圓盤,直接移動到c

如果n>=2,先將n-1個圓盤移動到b,再將剩下的乙個圓盤移動到c

將b的n-1個圓盤 通過a 移動到c

// a -> c

void hanota(vector& a, vector& b, vector& c)

/*** 將n個圓盤 從a 在b輔助下 移動到c

* n 要移動的個數

* a source

* b 輔助柱子

* c destination

*/void move(int n, vector& a, vector& b, vector& c)

if (n > 1)

}

程式設計師面試金典

1.有個小孩正在上樓梯,樓梯有n階台階,小孩一次可以上1階 2階 3階。請實現乙個方法,計算小孩有多少種上樓的方式。為了防止溢位,請將結果mod 1000000007 給定乙個正整數intn,請返回乙個數,代表上樓的方式數。保證n小於等於100000。int countways int n retu...

面試題 08 06 漢諾塔問題

面試題 08.06.漢諾塔問題 簡單題 遞迴 在經典漢諾塔問題中,有 3 根柱子及 n 個不同大小的穿孔圓盤,盤子可以滑入任意一根柱子。一開始,所有盤子自上而下按公升序依次套在第一根柱子上 即每乙個盤子只能放在更大的盤子上面 移動圓盤時受到以下限制 1 每次只能移動乙個盤子 2 盤子只能從柱子頂端滑...

面試題 08 06 漢諾塔問題

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