7 17 漢諾塔的非遞迴實現 25分

2021-10-22 23:44:08 字數 972 閱讀 1460

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

非遞迴演算法

一位美國學者發現:所有的漢諾塔移動可以總結為重複的兩步。我們假設現在最小的圓盤在a桿上,桿為a,b,c:

第一步:將最小圓盤移動到下乙個桿上;

第二步:對剩下兩個杆的頂上元素進行判斷,把較小的那個圓盤移動到較大的那個圓盤上(如果有空桿則移在空桿上)。

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

注意:這樣得到的最後的答案不一定是摞在c桿上,如果n是奇數則將摞在b上。所以如果n是奇數我們把杆的擺放順序設定為a、c、b,這樣就能保證盤子是從a杆全部移動到c杆。

#include

#include

#include

using

namespace std;

string s =

"0abc"

;stack<

int>a[4]

;bool

move

(int before,

int after)

intmain()

return0;

}

7 17 漢諾塔的非遞迴實現 25分

參考 的和的。簡單說一下我理解到的方法吧 第一步是判斷輸入的n是奇數還是偶數,若為奇數,則按順時針以acb的順序擺成品字型,若為偶數,則按順時針以abc的順序擺成品字型。參考下圖 第二步將序號為1 最小 的盤,按順時針放到下乙個字母。假如以abc順序順時針擺放時,若1盤在a,則將它移動到b,若在b則...

7 17 漢諾塔的非遞迴實現 25 分

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

5 17 漢諾塔的非遞迴實現 25分

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