zoukankan      html  css  js  c++  java
  • JZOJ 2136. 【GDKOI2004】汉诺塔

    Description

      古老的汉诺塔问题是这样的:用最少的步数将N个半径互不相等的圆盘从1号柱利用2号柱全部移动到3号柱,在移动的过程中小盘要始终在大盘的上面。
      现在再加上一个条件:不允许直接把盘从1号柱移动到3号柱,也不允许直接把盘从3号柱移动到1号柱。
      把盘按半径从小到大用1到N编号。每种状态用N个整数表示,第i个整数表示i号盘所在的柱的编号。则N=2时的移动方案为:
      (1,1)=>(2,1)=>(3,1)=>(3,2)=>(2,2)=>(1,2)=>(1,3)=>(2,3)=>(3,3)
      初始状态为第0步,编程求在某步数时的状态。
     

    Input

      输入文件的第一行为整数T(1<=T<=50000),表示输入数据的组数。
      接下来T行,每行有两个整数N,M(1<=n<=19,0<=M<=移动N个圆盘所需的步数)。

    Output

      输出文件有T行。
      对于每组输入数据,输出N个整数表示移动N个盘在M步时的状态,每两个数之间用一个空格隔开,行首和行末不要有多余的空格。
     

    Sample Input

    4
    2 0
    2 5
    3 0
    3 1
    

    Sample Output

    1 1
    1 2
    1 1 1
    2 1 1
    
     
    做法:模拟然后找规律, 具体看代码啦
     
    代码如下:
     1 #include <cstdio>
     2 #include <cstring>
     3 #include <string>
     4 #include <algorithm>
     5 using namespace std;
     6 int t;
     7 long long n, m; 
     8 
     9 int main()
    10 {
    11     scanf("%d", &t);
    12     int g[6] = {1, 2, 3, 3, 2, 1};
    13     while (t--)
    14     {
    15         scanf("%lld%lld", &n, &m);
    16         long long p = 6, p2 = 1;
    17         for (int i = 1; i <= n - 1; i++)
    18         {
    19             printf("%d ", g[(m % p) / p2]);
    20             p *= 3;
    21             p2 *= 3;
    22         }
    23         printf("%d", g[(m % p) / p2]);
    24         if (t != 0)    printf("
    ");
    25     }
    26 }
  • 相关阅读:
    bzoj3527: [Zjoi2014]力 fft
    bzoj3295: [Cqoi2011]动态逆序对 cdq分治
    快速读入fread
    km板子(二分图最大权匹配)
    spfa毒瘤算法
    牛客网暑期ACM多校训练营(第三场)DEncrypted String Matching fft
    P4173 残缺的字符串 fft
    圆和多边形交模板
    hdu多校2C
    Codeforces Round #449 (Div. 1)C
  • 原文地址:https://www.cnblogs.com/traveller-ly/p/9338402.html
Copyright © 2011-2022 走看看