jzoj 6797. 【2014广州市选day2】hanoi

Description

你对经典的hanoi塔问题必定已经很熟悉了。有三根柱子,n个大小不一的圆盘,要求大盘不能压在小盘上,初始时n个圆盘都在第一根柱子上,最少要多少步才能挪到最后一根柱子上?
如今咱们来将hanoi塔扩展一下,由三根柱子扩展到四根柱子,其他规则不变。例如,3个圆盘,四根柱子A到D,初始时圆盘都A柱上,咱们用五步就能够将圆盘都挪到D柱上:
第一步:将圆盘1从A挪到B;
第二步:将圆盘2从A挪到C;
第三步:将圆盘3从A挪到D;
第四步:将圆盘2从C挪到D;
第五步:将圆盘1从B挪到D。
你的任务是写一个程序求解四柱子hanoi塔问题最少要多少步能够解决。spa

Input

输入只有一行,为一个正整数n。(1<=n<=1000)code

Output

输出为一个正整数,表明n盘四柱子hanoi塔问题最少要多少步能够解决。ip

Solution

在作经典汉诺塔问题的时候,咱们是用递推求出n个盘子时的步数的,咱们作这道题的时候也就类比,尝试是否可以递推解决问题
如下是前10个数的表input

盘子数 步数
1 1
2 3
3 5
4 9
5 13
6 17
7 25
8 33
9 41
10 49
... ...

观察上面的表格,咱们发现,从1个盘子到2个盘子与2个到3个各增长了2步即\(2^{1}\)步;从3个到4个、从4个到5个与从5个到6个各增长了4步即\(2^{2}\)步,以此类推,咱们作出猜测it

\[f_{i}=f_{i-1}+2^{k} \]

其中\(k \in N^{*}\)且是递增的
对于\(2^{k}\)会加(k+1)次
数据\(n \leqslant 1000\)因此直接递推就好io

#include <cstdio>
#include <algorithm>
#define open(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
int n,cnt,num,i;
long long add,f[1001];
int main()
{
    open("hanoi");
    scanf("%d",&n);
    f[1]=1;f[2]=3;f[3]=5;
    add=4;cnt=3;num=3;
    for (i=4;i<=n;i++)
    {
        f[i]=f[i-1]+add;
        cnt--;
        if (!cnt) cnt=++num,add*=2;
    }
    printf("%lld",f[n]);
    return 0;
}
相关文章
相关标签/搜索