其实深度优先搜索就是一种动态规划
下面让我们来模拟一下汉诺塔的写法
动态规划怎么规划呢,其实找到几个点就可以
第一个就是最容易想到的转移条件,汉诺塔的思想是什么呢?
比如给你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;
}