打印本文 打印本文 关闭窗口 关闭窗口
算法问题 用SQL写出当M*N时的螺旋矩阵算法
作者:武汉SEO闵涛  文章来源:敏韬网  点击数6748  更新时间:2007/11/14 13:12:51  文章录入:mintao  责任编辑:mintao
-------------------------------------------------------------------------------------------------
    1   16   15   14   13
    2   17   24   23   12
    3   18   25   22   11
    4   19   20   21   10
    5    6    7    8    9

SQL>
不妨也填足一下:

代码:--------------------------------------------------------------------------------
SQL> exec :n := 5

PL/SQL 过程已成功完成。

SQL>  select replace(max(sys_connect_by_path(rank, '''','''')), '''','''') str
  2      from (select i, j,
  3                  case when rank() over(order by tag) - floor(:n * :n / 2) <= 0 then ''''     ''''
  4                       else to_char(rank() over(order by tag) - floor(:n * :n / 2), ''''9999'''') end as rank,
  5                  min(j) over(partition by i) minj
  6             from (select i,
  7                          j,
  8                    -- 顺时针螺旋特征码 counter-clockwise
  9                          case greatest(i - j, i + j - :n - 1, j - i, :n - i - j + 1)
 10                          when i - j then
 11                             :n - (i - j) || ''''1'''' || i
 12                          when i + j - :n - 1 then
 13                             :n - (i + j - :n - 1) || ''''2'''' || j
 14                          when j - i then
 15                             :n - (j - i) || ''''3'''' || (:n - i)
 16                          when :n - i - j + 1 then
 17                             :n - (:n - i - j + 1) || ''''4'''' || i
 18                          end as tag
 19                     from (select level as i from dual connect by level <= :n) a,
 20                          (select level as j from dual connect by level <= :n) b
 21   --                  where abs(i - j) < floor(:n / 2 + .6)
 22   --                    and i + j between floor(:n / 2 + .6) + 1 and floor(:n / 2 + .6) + :n
 23                 )
 24           )
 25      start with j = minj
 26      connect by j - 1 = prior j and i = prior i
 27      group by i
 28      order by i;

STR
----------------------------------------------------------------------------------------------------------------------
              7
         8   12    6
    1    9   13   11    5
         2   10    4
              3

SQL> exec :n := 7;

PL/SQL 过程已成功完成。

SQL> /

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

已选择7行。

SQL> exec :n := 9;

PL/SQL 过程已成功完成。

SQL> /

STR
----------------------------------------------------------------------------------------------------------------------
                       13
                  14   26   12
            

上一页  [1] [2] [3] [4] [5] [6]  下一页

打印本文 打印本文 关闭窗口 关闭窗口