当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, |