用棧求解漢諾塔問題(每日一道演算法題)

2021-08-10 23:22:12 字數 1351 閱讀 1220

首先,如果只剩最上層的塔需要移動,則有如下處理:

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