package com.baidu.text;
import java.util.Scanner;
public class SpiralArray {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
final int L = sc.nextInt();
int[][] arr = new int[L][L];
// 从i = 0, j = 0起开始迭代; m = 0, n = 1, 螺旋起始向右转; y = 0, 螺旋起始位置
arr[0][0] = spiralArray(arr, 0, 0, 0, 1, 0);
// 打印L阶螺旋矩阵
for (int[] is : arr) {
for (int i : is) {
System.out.print(i + " ");
}
System.out.println();
}
}
// 迭代法求L阶螺旋矩阵, 其中 m, n分别控制矩阵行和列的转向, y为螺旋位置
public static int spiralArray(int[][] arr, int i, int j, int m, int n, int y) {
int l = arr.length; // 外螺旋长度
int turn = l - 1; // 第一个转向点
if (y == l * l - 1) { // 终点
return arr[i][j] = l * l;
}
if (y == turn) { // 到达第一个转向点, 开始向下转
m = 1;
n = 0;
}
// 从第一个转向点开始, 每转向2次, 循环长度减1.
for (int k = 1;; k++) {
if (y == (turn += l - k)) { // 左上或者右下转向点, 向左或者向右转
n = -m;
m = 0;
break;
} else if (y < turn) { // 未到转向点, 此时螺旋位置处于左方或右方
break;
} else if (y == (turn += l - k)) { // 右上或者左下转向点, 向下或者向上转
m = n;
n = 0;
break;
} else if (y < turn) // 未到转向点, 此时螺旋位置处于上方或下方
break;
}
return arr[i][j] = spiralArray(arr, i + m, j + n, m, n, ++y) - 1; // 迭代,螺旋前进一个位置.
}
} |
|