您的位置:首页 > 编程语言

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

2017-06-29 23:49 363 查看
当size=4时, 二维螺旋矩阵如下图所示:



规律总结

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

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

可分层数为:若size为偶数,层数=size/2, 若为奇数,则层数=(size+1)/2;

第n层一个方向上的数字的数量为:size-2*n;

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

第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, |
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: