輸入 n (1-20),輸出 n×n 矩陣,數字從 1 開始順時針螺旋填充:
n=4 輸出:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
import java.util.*;
public class SpiralMatrix {
private int[][] matrix;
private int num = 1;
public void generate(int n) {
matrix = new int[n][n];
fillLayer(0, n);
print();
}
private void fillLayer(int offset, int size) {
if (size <= 0) return;
if (size == 1) { // 中心單元格
matrix[offset][offset] = num++;
return;
}
// 上:左→右
for (int i = 0; i < size; i++) matrix[offset][offset + i] = num++;
// 右:上→下 (排除頂點)
for (int i = 1; i < size; i++) matrix[offset + i][offset + size - 1] = num++;
// 下:右→左 (排除頂點)
for (int i = 1; i < size; i++) matrix[offset + size - 1][offset + size - 1 - i] = num++;
// 左:下→上 (排除頂點與終點)
for (int i = 1; i < size - 1; i++) matrix[offset + size - 1 - i][offset] = num++;
// 遞歸內層
fillLayer(offset + 1, size - 2);
}
private void print() {
for (int[] row : matrix) {
for (int v : row) System.out.printf("%4d", v);
System.out.println();
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Enter n (1-20): ");
int n = sc.nextInt();
new SpiralMatrix().generate(n);
}
}
O(n²) — 每個單元格恰好賦值一次。O(n²) — 存儲矩陣;遞歸深度 O(n) 棧空間可忽略。public void generateIterative(int n) {
int[][] m = new int[n][n];
int top = 0, bottom = n - 1, left = 0, right = n - 1;
int num = 1;
while (num <= n * n) {
for (int c = left; c <= right; c++) m[top][c] = num++;
top++;
for (int r = top; r <= bottom; r++) m[r][right] = num++;
right--;
if (top <= bottom) {
for (int c = right; c >= left; c--) m[bottom][c] = num++;
bottom--;
}
if (left <= right) {
for (int r = bottom; r >= top; r--) m[r][left] = num++;
left++;
}
}
// print...
}
m × n 非正方形,邊界條件改為 top <= bottom && left <= right。「分層遞歸」或「四邊界收縮迭代」是螺旋矩陣的兩大經典範式,掌握邊界條件處理(去重頂點)即可寫出無 Bug 代碼。