HDU 2077汉诺塔变形(2)

问题描述:在HDU 2064的基础上增加一条规则:最大的盘子可以放在其他盘子上,不可以从左移动到右或从右移动到左

 

因为最大的盘子的移动规则和其他盘子不一样,所以要单独处理它:

1)前n-1个盘子A->B

2)第n个盘子A->B->C

3)前n-1个盘子B->C

ans[n]=F[n-1]*2+2;    //F[n]为n个盘子移动到相邻柱的操作数

 

接下来规则就对所有盘子适用了,可以递推求解,首先要求上一步中出现的F[n],即相邻柱移动的操作数

1)前n-1个盘子A->C;

2)第n个盘子A->B;

3)前n-1个盘子C->B;

F[n]=f[n-1]+1+F[n-1];    //f[n]为n个盘子A->C的操作数,与F[n]不同

 

最后求出f[n]即可,这个和HUD 2064汉诺塔变形(1)问题相同:

f[n]=f[n-1]*3+2;

 

逐层求出即可得到答案:

#include<stdio.h>

int main()
{
    long long F[20],f[20],ans[21];
    int t,n,i;
    for(i=2,f[1]=2;i<20;i++)
        f[i]=f[i-1]*3+2;
    for(i=2,F[1]=1;i<20;i++)
        F[i]=F[i-1]+f[i-1]+1;
    for(i=2,ans[1]=2;i<21;i++)
        ans[i]=2*F[i-1]+2;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        printf("%d\n",ans[n]);
    }
    return 0;
}
posted @ 2014-02-20 13:12  zhen94  阅读(192)  评论(0编辑  收藏  举报