Hdu2511汉诺塔X

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



模拟(+递归)盘子移动的过程:
   1.如果m=a[n-1]+1,即刚好移动n号盘子,移动方向A-->C
   2.如果m>a[n-1],则考虑n-1号盘子,移动方向是B-->C,移动次数是m-(a[n-1]+1)
   3.如果m<=a[n-1],考虑n-1个盘子,移动方向是A-->B,移动次数是m;
   4.重复1,2,3点



#include <stdio.h>


int n;
__int64 m,a[64];


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值