棧與佇列5 漢諾塔問題 方案二

2021-10-01 19:13:15 字數 789 閱讀 2158

漢諾塔問題的基礎上,增加限制,必須得經過中間,不能直接從左到右或從右到左,求當塔有n層的時候列印最優移動過程和最優移動總步數

法一:遞迴法

法二:非遞迴法,用棧來模擬

法二:非遞迴法,用棧實現

把左,中,右抽象成棧,分別即為ls,ms,rs,最初所有的塊都在ls上,總共只能有四個動作,左到中,中到右,右到中,中到左,因為一次移動必須經過中間。每次都是從乙個棧的棧頂彈出然後壓入另外乙個棧裡。

兩個原則:1>不能小壓大2>相鄰不可逆(當前從l->m,下一步不能從m->l)

結論:

第一步一定是l->m在走出最少步數的過程中,四個動作只有乙個動作可以滿足上面的兩個原則。

public enum action

public int hanoiproblem2(int num,string left,string mid,string right,)

action record=;

int step=0;

while(!rs.size()!=num+1)

return step;

}public static int fstacktostack(action record, action prenoact,action nowact,stackfstack,stacktstack,string from,string to)

return 0;

}

棧與佇列5 漢諾塔問題

漢諾塔問題的基礎上,增加限制,必須得經過中間,不能直接從左到右或從右到左,求當塔有n層的時候列印最優移動過程和最優移動總步數。法一 遞迴法 法二 非遞迴法,用棧來模擬 法一 主要分兩種情況 public int hanoiproblem1 int num,string left,string mid...

關於漢諾塔問題二

根據以上的分析,不難寫出程式 void move char chsour,char chdest hanoi int n,char cha,char chb,char chc main 第二種 不使用遞迴方法。include using namespace std const int max 64 ...

用棧來求解漢諾塔問題

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