【說明】:
本文是左程雲老師所著的《程式設計師面試**指南》第一章中「用棧來實現漢諾塔問題」這一題目的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
【實現】:
實現及測試**:
/*view code*檔名: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 ()
【一點說明】:
這次題目的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...