[藍橋集訓-2] 初探動態規劃-漢諾塔

其實深度優先搜索就是一種動態規劃

下面讓我們來模擬一下漢諾塔的寫法

動態規劃怎麼規劃呢,其實找到幾個點就可以

第一個就是最容易想到的轉移條件,漢諾塔的思想是什麼呢?

比如給你2個物塊,那麼你的任務就是把第一個物塊移動到第二根柱子,再把第二個物塊移動到第三個柱子,最後再把第二根柱子的物塊移動到第三根柱子。

那麼你就可以去想想,如果給你n個物塊呢?

你的任務就是把n-1個物塊移動到第二根柱子,再把最底層的物塊移動到第三根柱子,最後再把n-1個物塊移動到第三根柱子,那麼這樣子移動就已經結束了。

第一次移動就是hanoi(int A, int B, int C,int n); 其中n代表移動的柱子數,ABC依次表示123三根柱子,這一步表示將A上面的n-1個物塊移動到C,那麼下一步是什麼呢?

我們需要分解一下問題,如果要把它全部移動到C,那麼應該首先將上面那些n-1移動到B,然後再將最底部的物塊從A移動到C,然後再將n-1個物塊從B移動到C。因此核心代碼應該這樣寫:

    hanoi(A, C, B, n-1);
    move(A, C);
    hanoi(B, A, C, n-1);

move函數表示實際操作將A的一個物塊移動到C

然後就是邊界條件了!!!馬上就寫好!!!

如果我們發現移動到最後一個物塊應該怎麼處理呢?

那就把它從A的位置移動到C的位置其他的不用去管!!!(這裏的A與C其實是傳入的參數,也有可能不是原來的A與C)

棧在此不多講

#include <iostream>
#include <stack>
using namespace std;
stack<int> S[3];
void move(int x, int y){
    int temp = S[x].top();
    S[x].pop();
    S[y].push(temp);
    cout<<x<<" --> "<<y<<endl;
}
void hanoi(int A, int B, int C,int n){
    if(n == 1){
        move(A, C);
        return;
    }
    hanoi(A, C, B, n-1);
    move(A, C);
    hanoi(B, A, C, n-1);
}

int main() {
    
    int n;
    cin >> n;
    for(int i = n; i >= 1; i--){
        S[0].push(i);
    }
    hanoi(0, 1, 2, n);
    while(!S[2].empty()){
        cout<<S[2].top()<<" ";
        S[2].pop();
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章