59. Spiral Matrix II

来源:互联网 发布:程序员项目经历怎么写 编辑:程序博客网 时间:2024/06/06 09:10

Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.

For example,
Given n = 3,

You should return the following matrix:
[ [ 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;        }    }}



原创粉丝点击