zoukankan      html  css  js  c++  java
  • SCAU 10893 Spiral

    10893 Spiral

    时间限制:1000MS  内存限制:65535K

    题型: 编程题   语言: 无限制

    Description

    Given an odd number n, we can arrange integers from 1 to n*n in the shape of a spiral. The figure 2.4.1 below illustrates the spiral made by integers from 1 to 25.

    【图片】

    21  22  23  24  25
    20   7   8   9  10
    19   6   1   2  11
    18   5   4   3  12
    17  16  15  14  13

        As we see above, each position in the spiral corresponds to a unique integer. For example, the number in row 1, column 1 is 21, and integer 16 is in row 5, column 2.

    Now, given the odd number n (1≤n≤32768), and an integer m (1≤m≤n*n), you should write a program to find out the position of m.

    输入格式

    The first line of the input is a positive integer T(T≤20). T is the number of the test cases followed. Each case consists of two integer n and m as described above.

    输出格式

        For each case, output the row number and column number that the given integer is in, separated by a single whitespace. Please note that the row and column number are both starting from 1.

    输入样例

    3
    3 9
    5 21
    5 16

    输出样例

    1 3
    1 1
    5 2

    来源

    zsu 

    作者

    200831000423

    解题思路

    上年校赛选拔的时候没做出来却将蛇形矩阵的规律找出来并打印出来,后来无疑肯定是TLE。数据量大就得找规律,解题的办法是找到这个数m在哪个圈子里。通过5*5矩阵可以找出斜线上在不同圈子里数之间的关系,打表存储,在给出数据的时候通过打表的值判断这个数在哪个圈子里然后在这个圈子里找对应的数的位置,具体看实现的代码

     1 #include<iostream>
     2  #include<cstdio>
     3  #include<string>
     4  #include<cstring>
     5  #include<algorithm>
     6  #define MAXN 34000
     7 
     8  using namespace std;
     9 
    10 int list[MAXN/2];
    11 
    12 void init()
    13 {//打表存储斜线上的值
    14     for(int i=0; i<MAXN/2; ++i)
    15     {
    16         if(!i) list[i] = 1;
    17         else list[i] = 8*i-2+list[i-1];
    18     }
    19 }
    20 
    21  int main()
    22  {
    23      #ifndef ONLINE_JUDGE
    24      freopen("F:\test\input.txt", "r", stdin);
    25      #endif // ONLINE_JUDGE
    26      init();
    27      int T, row, column;
    28      cin>>T;
    29      while(T--)
    30      {
    31          int n, m;
    32          cin>>n>>m;
    33          int circle = -1, cnt = 0, dis;
    34          while(list[++circle] < m);
    35          column = row = n/2+1-circle;
    36          dis = list[circle] - m; //仍需要移动的步数
    37          //找到圈子的情况下进一步处理数据找到最终的位置
    38          if(dis <= circle*4)
    39          {
    40              if(dis <= circle*2) row = row + dis;
    41              else
    42              {
    43                  row = row + circle*2;
    44                  column = column + (dis - circle*2);
    45              }
    46          }
    47          else
    48          {
    49              int temp = dis - circle*4;
    50              if(temp <= circle*2-1)
    51              {
    52                  row = row + circle*2 - temp;
    53                  column = column + circle*2;
    54              }
    55              else
    56              {
    57                  temp = temp - (circle*2-1);
    58                  row = row + 1;
    59                  column = column + circle*2 - temp;
    60              }
    61          }
    62         cout<<row<<" "<<column<<endl;
    63      }
    64 
    65      return 0;
    66  }
  • 相关阅读:
    JS经典面试题
    javascript数组(1) ——sort的工作原理及其他数组排序方法
    怎么去掉javascript 的Array的重复项
    Intellij IDEA运行Error ——Command line is too long
    angular-waring:global Angular与local Angular版本不一致问题
    idea(集成python)下载python插件失败
    PLSQL登录oracle显示无监听或协议适配器错误
    maven不能加载ojdbc6.jar的解决方法
    eclipse安装maven插件
    windows下gitbash安装教程
  • 原文地址:https://www.cnblogs.com/liaoguifa/p/3190180.html
Copyright © 2011-2022 走看看