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