首先,如果只剩最上層的塔需要移動,則有如下處理:
1.如果希望從「左」移到「中」,列印「move 1 from lef to mid」.
2.如果希望從「中」移到「左」,列印「move 1 from mid to left」.
3.如果希望從「中」移到「右」,列印「move 1 from mid to right」.
4.如果希望從「右」移到「中」,列印「move 1 from right to mid」
5如果希望從「左」移到「右」,列印「move 1 from left to mid」 和「move 1 from mid to right」
6.如果希望從「右」移到「左」,列印「move 1fromrighttomid」 和「move 1 from mid to left」
以上過程就是遞迴的終止條件,也就是只剩上層塔時的列印過程。
接下來,我們分析剩下多層塔的情況。
如果剩下n層塔,從最上到最下依次為1~n,則有如下判斷:
1.如果剩下的n層塔都在「左」,希望全部移到「中」,則有三個步驟。
1) 將1~n-1層塔先全部從「左」移到「右」,明顯交給遞迴過程。
2) 將第n層塔從「左」移到「中」。
3) 再將1~n-1層塔全部從「右」移到「中」,明顯交給遞迴過樣。.
從「右」移到「
2.如果把剩下的n層塔從「中」移到「左」,從「中」移到「右,
過程與情況1同理,一樣是分解為三步,在此不再詳述。
則有五個步驟。
3.如果剩下的n層塔都在「左」,希望全部移到「右」,
1) 將1~n-1層塔先全部從「左」移到「右」,明顯交給遞迴過程。
2) 將第n層塔從「左」移到「中」。
3) 將1~n-1層塔全部從「右」移到「左」,明顯交給遞迴過程。
4) 將第 n層塔從「中」移到「右」。
5) 最後將1~n-1層塔全部從「左」移到「右」,明顯交給遞迴過程。
4.如果剩下的n 層塔都在「右」,希望全部移到「左」,過程與情況3 同理,一樣
為五步,在此不再詳述。
public
static
inthanio(int num,string left,string mid,string right) else
}public
static
intprocess(int num,string left,string mid,string right,string from,string to) else
}if("mid".equals(from)||"mid".equals(to)) else
}
未完待續。。。。 用棧來求解漢諾塔問題
漢諾塔問題比較經典,這裡修改一下遊戲規則 現在限制不能從最左側的塔直接移動到最右側,也不能從最右側直接移動到最左側,而是必須經過中間。求當塔有n層的時候,列印最優移動過程和最優移動總步數。輸入描述 輸入乙個數n,表示塔層數 輸出描述 按樣例格式輸出最優移動過程和最優移動總步數 示例1輸入2輸出mov...
用棧來求解漢諾塔問題
說明 本文是左程雲老師所著的 程式設計師面試 指南 第一章中 用棧來實現漢諾塔問題 這一題目的c 棧方法的復現。感謝左程雲老師的支援。題目 漢諾塔問題比較經典,這裡修改一下遊戲規則 現在限制不能從最左側的塔直接移動到最右側,也不能從最右側直接移動到最左側,而必須經過中間。求當有n層塔的時候,列印最優...
用遞迴演算法求解漢諾塔問題
檔名稱 test3.1.cpp 完成日期 2016年09月08日 版本號 v1.0 問題描述 用遞迴演算法求解漢諾塔問題,其複雜度可以求得為o 2 n 是指數級的演算法 不同盤子所消耗的時間 輸入描述 無 程式輸出 演算法的執行時間 include define disccount 4 改變disc...