zoukankan      html  css  js  c++  java
  • 螺旋队列算法详解

    /* 螺旋队列
      设1的坐标是(0,0),的方向向右为正,y方向向下为正,
    例如,7的坐标为(-1,-1),2的坐标为(0,1)。
      编程实现输入任意一点坐标(x,y),输出所对应的数字。

         43 44 45 46 47 48 49
         42 21 22 23 24 25 26
         41 20   7   8   9 10 27
         40 19   6   1   2 11 28  
         39 18   5   4   3 12 29 
         38 17 16 15 14 13 30
         37 36 35 34 33 32 31
     
    算法:by smilelance (绝对独家,超级详细,如果你看完这个还不懂,我就无语了~~~)
    1、从1开始向外扩散,任意数字所在层应为:t = max(|x|,|y|)。比如5,9在第一层
    2、右上角斜线数字为:ur = (2t+1)*(2t+1) 左下角斜线数字为:dl = 2t*2t+1
    3、每一圈数字分为四个区域:比如25所在的第二层:
    21,22,23,24,25  A区,y == -t     
    17,18,19,20,  B区,x == -t  除掉A区数字
    13,14,15,16,  C区,y == t   除掉AB区数字
    10,11,12    D区,x == t   除掉ABC区数字

    4、每一圈数字总数都是8t,右上角数字最大, 减去若干个t就得到四个边的数字,

    这就是通过右上角数字取圈内任意数字的关键算法了
    */
    #define abs(a)    ((a)>0?(a):(-a))
    #define max(a,b)  ((a)>(b)?(a):(b))

    void print_helix_number(int n){
        int x, y;
        for(y=-n;y<=n;y++) {
            for(x=-n;x<=n;x++){
                printf("%5d",lookupHelixNumber(x,y)); //n 5以上数字就不对齐拉,嘿嘿
            }
          printf("/n");

        }
    }
     
    int lookupHelixNumber(int x, int y){
     int t = max(abs(x), abs(y));
     int ur = (2*t+1)*(2*t+1);
     int n = 1;
      if ( y == -t)
        n = ur-t+x;
      else if (x == -t)
        n = ur-3*t-y;    //3t, 5t啥的是规律,观察一圈数字就知道拉
      else if (y == t)
        n = ur-5*t-x;
      else
        n = ur-7*t+y;
       
      return n;
    }

  • 相关阅读:
    JDBC(5)-处理大数据
    JDBC(4)-Result结果集
    JDBC(3)-使用PreparedStatement接口实现增、删、改操作
    JDBC(2)-使用statment接口实现增删改操作
    JDBC(1)-连接数据库
    selenium+junit4实现参数化自动化测试
    selenium自动化测试用例需要关注的几点(二)
    【转】selenium自动化测试用例需要关注的几点(一)
    Selenium+excel实现参数化自动化测试
    POI基本操作
  • 原文地址:https://www.cnblogs.com/secbook/p/2655453.html
Copyright © 2011-2022 走看看