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 b2 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移...