基本思想:
自己想用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