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