基本思想:
自己想用dfs方式来进行遍历,但是发现找不到剪枝的方向,只能确定边界,状态无序;
如果采用递归的方法,可以进行问题分解;
本质上就是n个有序圆盘,相当于分解为以下几步:
1.将n-1个有序圆盘原封不动移到第三根杆子处;
2.将第n个最大盘子移到第二位;
3.把n-1个有序圆盘原封不动移回到第一根杆子去;
4.把第n个最大盘子移到第三位;
5.将n-1个有序圆盘原封不动移到第三根杆子处;
而n-1个有序圆盘怎么移,又是另一次递归;
递归边界就是一个盘子怎么移;
所以就可以得到递归表达式;
关键点:
如何分解问题;
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn = 66;
//int f[maxn];
ll charge(ll n) {
if (n == 1)
return 2;
return charge(n - 1) * 3 + 2;
}
int main() {
ll n;
while (cin >> n) {
//fill(f, f + maxn, 0);
cout<<charge(n)<<endl;
}
return 0;
}
杭电ACMOJ 汉诺塔问题III 需要注意一下递归问题 *递归
原文:https://www.cnblogs.com/songlinxuan/p/12447934.html