杭电ACMOJ 汉诺塔问题III 需要注意一下递归问题 *递归

基本思想:

自己想用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;
}

  

posted @ 2020-03-09 12:02  暮云林凌  阅读(270)  评论(0)    收藏  举报