Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.
For example,
Given n = 3
,
[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
题意:给定一个整数n,将1到n2 这些数按顺序填入n阶矩阵中,填充规则,从矩阵左上角开始顺时针依次填充,呈现螺旋结构。如上图。
我们定义一个方法fon(int[][] a,int i)用来实现下面这样一个功能:
从a[i][i]开始,顺时针填充好矩阵的一个闭合回路,例如n=3,i=0时,从a[0][0]=1开始,向右填充到3,再向下填充到5,之后向左填充到7,最后向上填充到8.
那么对于给定的n,只需要填充i=0,1,2.....n/2即可。
需要注意的地方是:我们初始化了一个n阶矩阵元素为-1.这是方便我们在fon方法中能够通过判断下一个元素是否为-1进行转向的操作。
下面贴代码:
public class Solution {
public int[][] generateMatrix(int n) {
int[][] a = new int[n][n];
if(n==0) return a;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
a[i][j] = -1;
}
}
a[0][0] = 1;
if(n%2==1) a[n/2][n/2] = n*n;
for(int i=0;i<n/2;i++){ //循环填充每个回路
fon(a,i);
}
return a;
}
public void fon(int[][] a ,int i){ //填充一个从a[i][i]开始的闭合回路;
int j = i,n = a.length;
if(i != 0) a[i][j]= a[i][j-1]+1;
while(j+1<n && a[i][j+1]==-1){ //判断向右填充是否继续进行还是进行转向
j++;
a[i][j] = a[i][j-1]+1;
}
while(i+1<n && a[i+1][j]==-1){ //判断向下填充是否继续进行还是进行转向
i++;
a[i][j] = a[i-1][j]+1;
}
while(j-1>=0 && a[i][j-1]==-1){ //判断向左填充是否继续进行还是进行转向
j--;
a[i][j] = a[i][j+1] + 1;
}
while(i-1>=0 && a[i-1][j]==-1){ //判断向右填充是否继续进行还是进行转向
i--;
a[i][j] = a[i+1][j] + 1;
}
}
}