假設有三個分別命名為x、y和z的塔座,在塔座x上插有n個直徑大小各不相同、依小到大編號為1,2,...,n的圓盤。現要求將x軸上的n個圓盤移至塔座z上並仍按同樣順序疊排,圓盤移動時必須遵循下列規則:1)每次只能移動乙個圓盤;
2)圓盤可以插在x、y和z中的任一塔座上;
3)任何時刻都不能將乙個較大的圓盤壓在較小的圓盤之上。
如何實現移動圓盤的操作呢?當n=1時,問題比較簡單,只要將編號為1的圓盤從塔座x直接移至塔座z上即可;當n>1時,需利用塔座y作輔助塔座,若能設法將壓在編號為n的圓盤之上的n-1個圓盤從塔座x(依照上述法則)移至塔座y上,則可先將編號為n的圓盤從塔座x移至塔座z上,然後再將塔座y上的n-1個圓盤(依照上述法則)移至塔座z上。而如何將n-1個圓盤從乙個塔座移至另乙個塔座的問題是乙個和原問題具有相同特徵屬性的問題,只是問題的規模小1,因此可以用同樣的方法求解。由此可得如下圖演算法所示的求解n階hanoi塔問題的c函式。
圖:求解n階hanoi塔問題的c函式
現在就請你將上述演算法實現吧。
輸入資料有多組,每組1個整數n,表示hanoi塔的階數。
將每次移動(move)按照以下格式輸出:%2d. move disk %d from %c to %c\n
上述格式中第乙個整數表示第幾次移動,第二個整數表示移動第幾個圓盤,後兩個字元表示將圓盤從哪個塔座移至哪個塔座上。每組輸出後面輸出乙個空行。
1
23
1、演算法描述中輸出使用的是%i,實際上就是使用%d。1. move disk 1 from x to z
1. move disk 1 from x to y
2. move disk 2 from x to z
3. move disk 1 from y to z
1. move disk 1 from x to z
2. move disk 2 from x to y
3. move disk 1 from z to y
4. move disk 3 from x to z
5. move disk 1 from y to x
6. move disk 2 from y to z
7. move disk 1 from x to z
2、輸出時移動次數是兩位的,我們保證輸入量不會太大。
3、如果使用全域性變數來記錄移動的次數,注意每次在進行乙個新的一組測試時,需要將這個全域性計數變數設為0。
總結:
hanoi塔(漢諾塔)是乙個典型的利用遞迴解決的問題。如果你對迭代(迴圈)更有偏好,不妨用迭代來實現試試。
#includeint count=1;
void move(char x,int n,char y)
void hanoi(int n,char x,char y,char z)
}int main()
return 0;
}
演算法分析 Hanoi塔問題
上圖為 3 階 hanoi 塔 假設有三個命名為 a b c 的塔座 在塔座a上插有n個直徑大小不相同,由小到大編號為1 2 3 n的圓盤,要求將a座上的圓盤移至塔座c 並按同樣的順序疊排 圓盤移動必須遵守下列規則 1 每次只能移動乙個圓盤 2 圓盤可以插在任意乙個塔座上 3 任何時刻都不能將乙個較...
遞迴實現hanoi塔問題演算法
三個塔座,x y z x上有n個直徑大小各不相同從大到小依次編號為n的圓盤,將x塔上的圓盤移到z塔,要求 每次只能移動乙個圓盤 任何時候不能將較大的圓盤壓在較小的圓盤之上 演算法分析 如果x塔上只有乙個圓盤,則直接移到z軸上即可 如果x塔上圓盤個數 1,先將x塔上的n 1個盤借助z塔依次挪到y塔上,...
n階漢諾塔的遞迴演算法
c語言編寫的一小段 include void hanoi int n,char a,char b,char c int main void hanoi int n,char a,char b,char c 執行結果 環境為codeblocks 演算法分析 1 先考慮乙個盤子的情況,再考慮2個盤子的情...