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