首页 > 其他 > 详细

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

时间:2020-03-09 14:48:41      阅读:83      评论:0      收藏:0      [点我收藏+]

基本思想:

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!