首页 > 其他 > 详细

HDU 2077汉诺塔变形(2)

时间:2014-02-21 00:42:30      阅读:443      评论:0      收藏:0      [点我收藏+]

问题描述:在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;

 

逐层求出即可得到答案:

bubuko.com,布布扣
#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;
}
bubuko.com,布布扣

HDU 2077汉诺塔变形(2)

原文:http://www.cnblogs.com/zhen94/p/3557437.html

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