Hdu2184汉诺塔VIII

题目链接  http://acm.hdu.edu.cn/showproblem.php?pid=2184


模拟:
 1.如果m=a[n],说明n个盘子从A移到了C,,移动次数为m
 2.若果m>a[n-1],说明n号盘子已经从A移到了C,并且考虑其他n-1个盘子,正从B--C,移动次数为m-(a[n-1]+1)
 3.如果m<=a[n-1],n号盘子未移动,考虑n-1个盘子,正从A-->B,移动次数为m
 4.重复1,2,3
#include <stdio.h>


int n,b[4][64];
__int64 m,a[64];


void hanio(int x,int y,int z,int n,__int64 m)
{
    int i,j,k;
    if(n<=0) return;
    if(m==a[n])
    {
        b[z][0]=n;
        for(i=1;i<=n;i++)
        b[z][i]=i;
        return ;
    }
    if(m>a[n-1])
    {
        b[z][++b[z][0]]=n;
        hanio(y,x,z,n-1,m-(a[n-1]+1));
        return ;
    }
    b[x][++b[x][0]]=n;
    hanio(x,z,y,n-1,m);
}


int main()
{
    int t,i,j;
    a[1]=1;
    for(i=2;i<=63;i++)
    {
        a[i]=2*a[i-1]+1;
    }
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%I64d",&n,&m);
        b[1][0]=b[2][0]=b[3][0]=0;
        hanio(1,2,3,n,m);
        for(i=1;i<=3;i++)
        {
            printf("%d",b[i][0]);
            if(b[i][0]<=0)
            {
                printf("\n");
                continue;
            }
            for(j=1;j<=b[i][0];j++)
            {
                printf(" %d",b[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值