pta 漢諾塔的非遞迴實現

2021-10-17 09:35:50 字數 1230 閱讀 5855

借助堆疊以非遞迴(迴圈)方式求解漢諾塔的問題(n, a, b, c),即將n個盤子從起始柱(標記為「a」)通過借助柱(標記為「b」)移動到目標柱(標記為「c」),並保證每個移動符合漢諾塔問題的要求。

輸入格式:

輸入為乙個正整數n,即起始柱上的盤數。
輸出格式:

每個操作(移動)佔一行,按柱1

-> 柱2的格式輸出。

輸入樣例:

3
輸出樣例:

a -

> c

a -> b

c -> b

a -> c

b -> a

b -> c

a -> c

思路:

(1)將最小圓盤移動到下乙個柱子上。

(2)對剩餘兩柱子進行頂上最小的元素判斷,把小一點的圓盤移動到大一點的圓盤上(有空柱則摞在空柱子上)。

重複上述兩步就可以得到答案。

注意:這樣得到的最後的答案不一定是摞在 c 上,如果 n 是奇數將摞在 b 上,所以如果 n 是奇數我們就令第二個柱子為 c ,第三個柱子為 b ,這樣就一定最後是摞在 c 上的。

ac**:

#include

#include

#include

using

namespace std;

stack<

int> s[3]

;char c[3]

=;void

move

(int x,

int y)if(

(!s[x]

.empty()

&& s[y]

.empty()

)||(!s[x]

.empty()

&&!s[y]

.empty()

&& s[y]

.top()

> s[x]

.top()

))}int

main()

if(n %2==

1)while(1

) k3 = k1;

k1 = k2;

k2 =

(k1 +1)

%3;move

(k3, k2);}

return0;

}

PTA7 17 漢諾塔的非遞迴實現

7 17 漢諾塔的非遞迴實現 25 分 借助堆疊以非遞迴 迴圈 方式求解漢諾塔的問題 n,a,b,c 即將n個盤子從起始柱 標記為 a 通過借助柱 標記為 b 移動到目標柱 標記為 c 並保證每個移動符合漢諾塔問題的要求。輸入格式 輸入為乙個正整數n,即起始柱上的盤數。輸出格式 每個操作 移動 佔一...

漢諾塔的遞迴和非遞迴實現

漢諾塔的遞迴和非遞迴實現 借助堆疊以非遞迴 迴圈 方式求解漢諾塔的問題 n,a,b,c 即將n個盤子從起始柱 標記為 a 通過借助柱 標記為 b 移動到目標柱 標記為 c 並保證每個移動符合漢諾塔問題的要求。輸入為乙個正整數n,即起始柱上的盤數。每個操作 移動 佔一行,按柱1 柱2的格式輸出。3a ...

3 2 漢諾塔的非遞迴實現

漢諾塔實現的基本思路是 不斷將n個盤的漢諾塔問題轉換為2個 n 1 個盤的漢諾塔問題,用遞迴實現比較好理解。設n盤問題為 n,a,b,c 其中引數如下結構體所定義,第乙個引數表示需要移動的盤子的數量,第二個引數表示n個盤子起始所在柱子a,第三個引數表示會被借用的柱子b,第四個引數表示這 n個盤子所在...