2018-2-12--汉诺塔

题目描述:

汉诺塔由编号为1到n大小不同的圆盘的三根柱子a,b,c组成。开始时,这n个圆盘由大到小依次套在a柱上,如图所示。要求把a柱上n个圆盘按下述规则移到c柱上:
    (1)一次只能移一个圆盘,它必须位于某个柱子的顶部;
    (2)圆盘只能在三个柱上存放;
    (3)任何时刻不允许大盘压小盘。
    将这n个盘子从a柱移动到c柱,最少需要移动多少次?

输入格式:

第一行输入一个正整数n(1<=n<=30),表示圆盘的数量。

输出格式:

输出一个数表示最少需要移动的次数。

Sample Input:

3

Sample Output:

7

思路:

首先,我们拿到这一道题,我们要想将全部圆盘都移到c柱,我们就需要先把除最后一个以外的所有的圆盘移到b柱,再将最大的一个移到c柱,最后将全部移到c柱。这样我们可以发现,若用f[n]表示当前n个圆盘需要的步数,那么f[n]=2*f[n-1]+1。
下面是代码的实现:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
int f[35];       //注意这里的数据范围,根据题目要求来开空间
int main()
{
	f[1] = 1;
	int n;
	cin >> n; 
	for(int i = 2; i <= n; i++){
		f[i] = 2*f[i-1]+1;      //解题关键
	}
	cout << f[n];
	return 0;
}
这便是递推中一道基础而又经典的题,这道题给我们一个启示:递推其实很简单,只要去分析好题目中的关系,可以用很多的方法去找到关系式,然后写出来。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值