HUD2511改——汉诺塔X

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;
}