Hdu2511汉诺塔X

来源:互联网 发布:百度鹰眼定位软件 编辑:程序博客网 时间:2024/05/17 07:41

题目链接 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;
}