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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值