package com.ytx.array;
import java.util.ArrayList;
/** 题目:spiral-matrix-ii
*
* 描述: Given an integer n, generate a square matrix filled with elements from 1 to n 2 in spiral order.
For example,
Given n =3,
You should return the following matrix:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
*
* @author yuantian xin
* 给你一个数字n,生成一个方阵,里面是用整数1~n的二次方这n*n个数以螺旋顺序填充的。
*/
public class Spiral_matrix_ii {
public int[][] generateMatrix(int n) {
if(n <= 0) {
return null;
}
int [][] matrix = new int[n][n];
//左右上下四个边界
int left = 0;
int right = n - 1;
int top = 0;
int bottom = n - 1;
//填充的数
int data = 1;
//循环收窄边界,螺旋遍历,边界都是向中间收窄
for( ; ;) {
//上边,从左到右
for(int i = left; i <= right; i++) {
matrix[top][i] = data;
data ++;
}
//横向遍历完上边一行之后,上边界增加向中间收窄,所以++top,再判断上下边界是否重叠
if(++top > bottom) break;
//右边,从上到下
for(int i = top; i <= bottom; i++) {
matrix[i][right] = data;
data ++;
}
//竖向遍历完右边一列之后,右边界减少向中间收窄,所以--right,再判断左右边界是否重叠
if(left > --right) break;
//下边,从右向左
for(int i = right; i >= left; i--) {
matrix[bottom][i] = data;
data++;
}
//横向遍历下边一行,下边界减少向中间收窄,所以--bottom,再判断上下边界是否重叠
if(top > --bottom) break;
//左边,从下到上
for(int i = bottom; i >= top; i--) {
matrix[i][left] = data;
data++;
}
//竖向遍历左边一列,左边界增加向中间收窄,所以++left,再判断左右边界是否重叠
if(++left > right) break;
}
return matrix;
}
public static void main(String[] args) {
int n = 3;
int [][] matrix = new int[n][n];
matrix = new Spiral_matrix_ii().generateMatrix(n);
for(int i = 0; i < matrix.length; i++) {
for(int j = 0; j < matrix.length; j++) {
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}
}
}