HUD2511改——汉诺塔X
这道题无非是找规律。不知为何我是认为盘子越小序号越小做的,做出来居然通过了。但不管,我们找找规律。
3个的时候:
1 |
1:1-3 |
2 |
2:1-2 |
3 |
1:3-2 |
4 |
3:1-3 |
5 |
1:2-1 |
6 |
2:2-3 |
7 |
1:1-3 |
4个的时候:
1 |
1:1-2 |
2 |
2:1-3 |
3 |
1:2-3 |
4 |
3:1-2 |
5 |
1:3-1 |
6 |
2:3-2 |
7 |
1:1-2 |
8 |
4:1-3 |
9 |
1:2-3 |
10 |
2:2-1 |
11 |
1:3-1 |
12 |
3:2-3 |
13 |
1:1-2 |
14 |
2:1-3 |
15 |
1:2-3 |
16 |
1:3-1 |
仔细研究研究就能发现,1号出现在·1,3,5,7,9
2号出现在2,6,10,14
3号出现在4,12
4号在8,
规律与2^n有关。
我们在研究研究,三个时:
一号盘的行动方式是:
1-3
3-2
2-1
1-3
二号盘的行动方式是:
1-2
2-3
四个时:
一号盘的行动方式是:
1-2
2-3
3-1
1-2
2-3
3-1
1-2
2-3
二号盘的行动方式是:
1-3
3-2
2-1
1-3
三号盘的行动方式是:
1-2
2-3
我们可看出有明显的循环。结合盘子号与盘子总数,我们写个程序:
#include<stdio.h>
#include <math.h>
int main()
{
int T,z;
scanf("%d",&T);
for(z=0; z<T; z++)
{
int n;
long long m;
scanf("%d%lld",&n,&m);
unsigned long long m2;
m2=m;
int i=1;
while(m%2==0)
{
i++;
m=m/2;
}
printf("%d",i);
long long int tp;
unsigned long long intadn=pow(2,i);
tp=(m2/adn)%3;
if(n%2==0)
{
if(i%2!=0)
{
switch(tp)
{
case 0:
printf("12\n");
break;
case 1:
printf("23\n");
break;
case 2:
printf("31\n");
break;
}
}
else
{
switch(tp)
{
case 0:
printf("13\n");
break;
case 1:
printf("32\n");
break;
case 2:
printf("21\n");
break;
}
}
}
else
{
if(i%2!=0)
{
switch(tp)
{
case 0:
printf("13\n");
break;
case 1:
printf("3 2\n");
break;
case 2:
printf("21\n");
break;
}
}
else
{
switch(tp)
{
case 0:
printf("12\n");
break;
case 1:
printf("23\n");
break;
case 2:
printf("31\n");
break;
}
}
}
}
return 0;
}