首页 > 代码库 > 编程题之打印二维螺旋矩阵

编程题之打印二维螺旋矩阵

当size=4时, 二维螺旋矩阵如下图所示:

技术分享

 

规律总结

  可以把这个二维矩阵看成一层套一层,如上图所示,1->4->7->10->12为第零层,

13->14->15->16为第一层,所以当size=4时,总共有两层。规律如下:

  1. 可分层数为:若size为偶数,层数=size/2, 若为奇数,则层数=(size+1)/2;
  2. 第n层一个方向上的数字的数量为:size-2*n;

    这是因为第零层的一个方向上数字的数量就是size, 而第一层是size-2,...第n层就是size-2*n;

  3. 第n层上数字的数量为4*(size-2*n) - 4,这里的size-2*n就是(2)中一个方向上的数字的数量。

    由此推知,若第n层的第一个数字为x,则第n+1层的第一个数字为x+4*(size-2*n)- 4,

    例如4*4矩阵中,第0层的第一个数字为1, 则第1层的第一个数字为1 + 4 * 4 - 4 = 13。

代码

有了以上的规律,就可以写代码了,博主的代码如下,供参考。

其中,在填充每一层的数字时,下,左,上都重复了第一个数字,并且要注意的是,最后向上的一步不能覆盖这一层的首数字

具体以本文开头的那个图为例,第零层填充顺序就是:

        右:1,2,3,4,;

        下:4,5,6,7

        左:7,8,9,10

        上:10,11,12。

向上的如果在写成:10, 11, 12, 13就把开头的数字1给冲掉了。

 1 public class SnakeArray {
 2 
 3     public static int[][] fillSnakeArray(int size) {
 4         int[][] sa = new int[size][size];
 5         int startEle = 1;
 6         int layerNum = (size % 2 == 0) ? size / 2 : (size + 1) / 2;
 7         for (int layer = 0; layer < layerNum; layer++) {
 8             fillLayer(size, startEle, layer, sa);
 9             int sizeInLayer = size - 2 * layer;
10             startEle += 4 * (sizeInLayer - 1);
11         }
12         return sa;
13     }
14 
15     public static void fillLayer(int size, int startEle, int layer, int[][] sa) {
16         int layerSize = size - 2 * layer;
17         int eleTmp = startEle;
18 
19         int row = layer;
20         int col = layer;
21         //(1) >
22         for (int i = 0; i < layerSize; i++) {
23             sa[row][col++] = eleTmp++;
24         }
25         col -= 1;
26         eleTmp -= 1;
27         //(2) V
28         for (int i = 0; i < layerSize; i++) {
29             sa[row++][col] = eleTmp++;
30         }
31         row -= 1;
32         eleTmp -= 1;
33         //(3) <
34         for (int i = 0; i < layerSize; i++) {
35             sa[row][col--] = eleTmp++;
36         }
37         col += 1;
38         eleTmp -= 1;
39         //(4) ^ 防止覆盖这一层的第一个数字,循环到layerSize-1而不是layerSize
40         for (int i = 0; i < layerSize - 1; i++) {
41             sa[row--][col] = eleTmp++;
42         }
43     }
44 
45     public static void main(String[] args) {
46         int n = 5;
47         int[][] sa = fillSnakeArray(n);
48         for (int i = 0; i < n; i++) {
49             for (int j = 0; j < n; j++) {
50                 System.out.print(sa[i][j] + ",");
51             }
52             System.out.println(" | ");
53         }
54     }
55 }

 运行结果:

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

 

编程题之打印二维螺旋矩阵