漢諾塔實現的基本思路是:不斷將n個盤的漢諾塔問題轉換為2個(n-1)個盤的漢諾塔問題,用遞迴實現比較好理解。設n盤問題為(n, a, b, c),其中引數如下結構體所定義,第乙個引數表示需要移動的盤子的數量,第二個引數表示n個盤子起始所在柱子a, 第三個引數表示會被借用的柱子b, 第四個引數表示這 n個盤子所在的目標柱子c。
假設(n, a, b, c)表示把 a柱子上的n個盤借助b柱子移動到 c 柱子上,這個問題的遞迴求解方式是
先把 a 柱子的(n-1)盤子借助c柱子移動到b柱子上(n-1, a, c, b),
然後把 a 柱子剩下的乙個盤子移動到 c 柱子上(1, a, b, c),
最後把 b 柱子上的(n-1)個盤子移動到 c 柱子上(n-1, b, a, c)
則問題求解可轉換為對(n - 1, a, c, b)、(1, a, b, c)、(n - 1, b, a, c)這三個問題的求解,其中(1, a, b, c)不需要遞迴,可直接實現,將n個盤的漢諾塔問題轉換為2個(n-1)個盤的漢諾塔問題,然後使用遞迴將(n-1)盤問題轉換成(n-2)盤問題,直到盤數為1
遞迴方式本質上使用棧來實現的,所以如果採用非遞迴的方式也是使用棧來輔助實現。
但是若是用堆疊來實現的話,當將分解出的上述三個問題壓入棧時,應該按照「需要先求解的問題後壓入」的順序,也就是壓入順序為:(n - 1, b, a, c), (1, a, b, c), (n - 1, a, c, b).
1 typedef structelementtype; //
漢諾塔問題的結構型別
1//借助棧的非遞迴實現
2void hanoi(intn)3
28}29 }
下面是棧的實現和主函式:
1 #include 2#define maxsize 100
34 typedef struct
stack; //
堆疊的標準定義89
void push(stack *ptrs, elementtype item)
1017
else
1822}23
24 elementtype pop(stack *ptrs)
2531
else
3236}37
38int
main()
39
漢諾塔的遞迴和非遞迴實現
漢諾塔的遞迴和非遞迴實現 借助堆疊以非遞迴 迴圈 方式求解漢諾塔的問題 n,a,b,c 即將n個盤子從起始柱 標記為 a 通過借助柱 標記為 b 移動到目標柱 標記為 c 並保證每個移動符合漢諾塔問題的要求。輸入為乙個正整數n,即起始柱上的盤數。每個操作 移動 佔一行,按柱1 柱2的格式輸出。3a ...
pta 漢諾塔的非遞迴實現
借助堆疊以非遞迴 迴圈 方式求解漢諾塔的問題 n,a,b,c 即將n個盤子從起始柱 標記為 a 通過借助柱 標記為 b 移動到目標柱 標記為 c 並保證每個移動符合漢諾塔問題的要求。輸入格式 輸入為乙個正整數n,即起始柱上的盤數。輸出格式 每個操作 移動 佔一行,按柱1 柱2的格式輸出。輸入樣例 3...
漢諾塔非遞迴演算法
輸入格式 輸入為乙個正整數n,即起始柱上的盤數。輸出格式 每個操作 移動 佔一行,按柱1 柱2的格式輸出 輸入樣例 3輸出樣例 a c a b c b a c b a b c 乙個美國學者總結得到 所有的漢諾塔移動可以總結為重複的兩步,我們假設現在最小的圓盤在a柱子上,柱子為a,b,c 第二步 對a...