借助堆疊以非遞迴(迴圈)方式求解漢諾塔的問題(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個盤子所在...