用棧來求解漢諾塔問題

2022-04-06 00:31:56 字數 1751 閱讀 2486

【說明】:

本文是左程雲老師所著的《程式設計師面試**指南》第一章中「用棧來實現漢諾塔問題」這一題目的c++棧方法的復現。

感謝左程雲老師的支援。

【題目】:

漢諾塔問題比較經典,這裡修改一下遊戲規則:現在限制不能從最左側的塔直接移動到最右側,也不能從最右側直接移動到最左側,而必須經過中間。求當有n層塔的時候,列印最優移動過程和最優移動總步數。

例如,當塔為兩層時,最上層的塔記錄為1,最下層的塔記錄為2,則列印:

move 1 from left to mid

move 1 from mid to right

move 2 from left to mid

move 1 from right to mid

move 1 from mid to left

move 2 from mid to right

move 1 from left to mid

move 1 from mid to right

it will move 8 steps.

【思路】:

漢諾塔的第乙個原則:不可以小壓大;

漢諾塔的第二個原則:若求最優解,不可後退。

【編譯環境】:

centos6.7(x86_64)

gcc 4.4.7

【實現】:

實現及測試**:

/*

*檔名:limithanoi.cpp

*問題描述:限制漢諾塔移動方法,只能由左到中,由中到左,由中到右,由右到中,

* 不可直接由左到右,由右到左。

* 利用棧的結構求得最佳路徑。

* 下面是c++/stack實現**。 */

#include

#include

#include

using

namespace

std;

enum

action ;/*

*函式介紹:移動漢諾塔上的圓盤。

*輸出引數:pre記錄即將發生的移動步驟;src移動圓盤後的棧;dst移動圓盤後的棧。

*返回值:若圓盤移動成功,則返回移動歩數1;若失敗,則返回移動歩數0。 */

int movedisc(action &record,action now,stack &src,stack &dst)

record =now;

return1;

}return0;

} /*

*函式介紹:解決限制移動方式的漢諾塔問題的c++實現

*輸入引數:layer為漢諾塔的層數

*輸出引數:無

*返回值:為移動的歩數 */

int hanoistack(int

layer)

action record =no;

int step = 0

;

while(rs.size() !=layer)

return

step;}/*

*函式介紹:測試** */

intmain ()

view code

【一點說明】:

這次題目的c++復現和左老師所寫的略有差別,但是解題思路還是遵循這左老師所提出來的。

注:

用棧來求解漢諾塔問題

漢諾塔問題比較經典,這裡修改一下遊戲規則 現在限制不能從最左側的塔直接移動到最右側,也不能從最右側直接移動到最左側,而是必須經過中間。求當塔有n層的時候,列印最優移動過程和最優移動總步數。輸入描述 輸入乙個數n,表示塔層數 輸出描述 按樣例格式輸出最優移動過程和最優移動總步數 示例1輸入2輸出mov...

漢諾塔問題求解

漢諾塔問題求解 問題描述 a,b,c三個柱子,其中a插著n個盤子從上到下按照小到大放,嘗試以b盤子為中介,每次移一次,將a中的盤子從上到下按照小到大插 演算法 n個盤子全放在a上面,分為兩步走 將前面 n 1 個盤子全部放到b上面,然後將第n個盤子放到c中 這樣子b中就有 n 1 個盤子,再以a為中...

用遞迴演算法求解漢諾塔問題

檔名稱 test3.1.cpp 完成日期 2016年09月08日 版本號 v1.0 問題描述 用遞迴演算法求解漢諾塔問題,其複雜度可以求得為o 2 n 是指數級的演算法 不同盤子所消耗的時間 輸入描述 無 程式輸出 演算法的執行時間 include define disccount 4 改變disc...