-
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
-
相关题目:
- 54.螺旋矩阵、剑指offer29.顺时针打印矩阵
public class SpiralMatrix {
public static void main(String[] args) {
int[][] spiralMatrix = getSpiralMatrix(5);
for (int[] matrix : spiralMatrix) {
for (int i : matrix) {
System.out.print(" "+ i +" ");
}
System.out.println();
}
}
/**
* 实现螺旋矩阵的重点是:模拟顺时针画矩阵的情形,坚持循环不变量的原则
* (左闭右开) (左开右闭)
* 0 0 1 0 1 1
* 3 * 1 0 * 2
* 3 2 2 3 3 2
* 上侧从左到右
* 右列从上到下
* 下侧从右到左
* 左列从下到上
*
* 最中间的元素需要分情况,当给定数是奇数,则存在最中间的元素;是偶数的话则不存在。
* @param N
* @return
*/
private static int[][] getSpiralMatrix(int N) {
//定义一个二维数组来存放
int[][] array = new int[N][N];
//规定每次开始坐标
int beginX = 0;
int beginY = 0;
//定义存入的数字
int num = 1;
//定义偏移量
int Offset = 1;
//定义循环次数
int loop = N / 2;
//定义中间位置
int mid = N / 2;
while (loop > 0) {
int i = beginX;
int j = beginY;
//上侧从左到右
for (; j < beginY + N-Offset; j++) {
array[beginX][j] = num++;
}
//右列从上到下
for (;i < beginX + N-Offset; i++) {
array[i][j] = num++;
}
//下侧从右到左
for (; j > beginY ; j--) {
array[i][j] = num++;
}
//左侧从下到上
for (; i > beginX ; i--) {
array[i][j] = num++;
}
//一圈结束,循环次数-1
loop --;
//起始坐标各自+1
beginX += 1;
beginY += 1;
//每多一次循环,内层循环的就会比之前的上下左右少两格,偏移量就需要+2
Offset += 2;
}
if (N % 2 != 0) array[mid][mid] = N * N;
return array;
}
}