59. Spiral Matrix II

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;
        }
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值