[蓝桥集训-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;
}

 

    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/qq_40631528/article/details/88724582
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞