题目描述:
汉诺塔由编号为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;
}
这便是递推中一道基础而又经典的题,这道题给我们一个启示:递推其实很简单,只要去分析好题目中的关系,可以用很多的方法去找到关系式,然后写出来。