9410 雙色漢諾塔

2022-09-14 18:30:10 字數 1903 閱讀 7768

time limit: 1000ms second

memory limit: 32m 問題描述:

設a、b、c是3 個塔座。開始時,在塔座a上有一疊共n個圓盤,這些圓盤自下而上, 由大到小地疊在一起。各圓盤從小到大編號為1,2,……,n,奇數號圓盤著紅色,偶數號 圓盤著藍色,如圖所示。現要求將塔座a 上的這一疊圓盤移到塔座b 上,並仍按同樣順序 疊置。在移動圓盤時應遵守以下移動規則:

規則(1):每次只能移動1 個圓盤;

規則(2):任何時刻都不允許將較大的圓盤壓在較小的圓盤之上;

規則(3):任何時刻都不允許將同色圓盤疊在一起;

規則(4):在滿足移動規則(1)-(3)的前提下,可將圓盤移至a,b,c中任一塔座上。

試設計乙個演算法,用最少的移動次數將塔座a 上的n 個圓盤移到塔座b 上,並仍按同 樣順序疊置。

演算法設計:

對於給定的正整數n,計算最優移動方案。

輸入資料。第1 行是給定的正整數n。

每一行由乙個正整數k 和2 個字元c1 和c2組成,表示將第k個圓盤從塔座c1移到塔座c2上。

3
1 a b

2 a c

1 b c

3 a b

1 c a

2 c b

1 a b

【題解】

雙色漢諾塔和單色漢諾塔是等價的問題。就是說雙色漢諾塔的答案和單色漢諾塔的答案是一樣的。

我在網上看了一下。發現看不懂原理。所以我就想。記下來就好了。

只要會單色漢諾塔就好。。

這裡只考慮單色的情況。講一下最基礎的漢諾塔問題。

還是把n個圓盤從a移動到b

比如n==2.

則把最上面那個小的放在c.

然後把那個大的放在b。然後把放在c的最小的放在b。

就完成了。

然後n=3的情況。

①考慮把a上的n-1個圓盤放到c上。

②然後把a上的乙個大圓盤放在b上。

③然後把c上的n-1個圓盤放到b上。

完成!這樣的確很理想。

但是要怎麼放呢?

你這是空中樓閣啊!!!

我們考慮①

把a上的2個圓盤放到c上。

還記的我們n==2的情況嗎。

即把2個圓盤從a放到b。我們是可以實現的。

那我們完全可以把n==3的問題轉換一下。

即最下面那個圓盤就當它不存在。(因為上面兩個圓盤都比它小。你是可以把它當做不存在的,誰放在上

面都沒關係。);

於是我們把兩個圓盤從a放到c也就等價於把兩個圓盤從a放到b.只是我們原本把c當做過度的柱子使用。

現在是把b當做過度的柱子使用了。

移動的初始和目標換了一下而已。

明確了①步驟可以實現之後。

然後把2個圓盤從a放到c之後。我們把a上剩餘的那個最大的圓盤。從a放到b。即②

然後又是③

把n-1個圓盤從c移動到b。

還是一樣的嘛!

我們還是把那個最大的圓盤當做不存在就好。

又轉換成把2個圓盤從乙個柱子移動到另外乙個柱子上了。(還有另外乙個柱子給你當過度的使用);

可以看到n=4的時候

我們需要把3個圓盤從a移動到c。然後把乙個圓盤從a移動到b。再把3個圓盤從c移動到b。

還是一樣。我們只要把那個最大的圓盤當做不存在。n==4的問題又轉換成n==3的問題了

即從a->c->b這些過程可以轉成n==3的情況來做。

可以發現這是乙個遞迴程式;

【**】

/**/

#include #include int k, top[4][100] = ;

void mov(int,char, char , char);

int main()

void mov(int n,char a, char b, char c)

雙色漢諾塔

分析 設盤子原來在a柱上,目標為b c柱。顯然與單色漢諾塔問題相同為典型的遞迴問題。將最後的盤子移動的目標步驟為 1 除最後兩個盤子外,將所有的盤子移動到c 2 將最後的兩個盤子移動到b 3 再將c上所有的盤子移動到a 4 最後將b上的乙個盤子移動c。易得移動出最後兩個盤子以外,可以將大小相同顏色不...

雙色漢諾塔

先說一說普通漢諾塔吧,思路就是先將前n 1個方塊借助c放到b上,最後乙個直接放在c上,下一步是將這n 1個方塊借助a放在c上,至此完成任務。include 第乙個塔為初始塔,中間的塔為借用塔,最後乙個塔為目標塔 int i 1 記錄步數 void move int n,char from,char ...

雙色漢諾塔問題

雙色漢諾塔問題 圓盤最初是混合顏色的從小到大排好的,現在要求根據其顏色分開到兩個柱子上分別從小到大排好。三色漢諾塔問題可與此類似,分別是排到三個柱子上。與漢諾塔問題類似,稍作一點改動,假設柱子的編號為abc,共有n個圓盤 n為偶數 1.將最上面的n 1個圓盤從a移動到b上面 2.將底部那個圓盤從a移...