在演算法練習中,將自然數以螺旋方式填入方陣是經典題目。本文將詳細解析如何使用 Java 實作二維陣列的螺旋轉向填充,從外層向內層依序排列數字。
螺旋填充的關鍵在於控制四個方向的邊界:右、下、左、上。每完成一圈,邊界向內收縮,直到所有位置填滿。程式碼採用單一迴圈搭配條件判斷,依據索引計算當前應填充的座標。
package test;
/**
* 螺旋陣列產生器
* 範例輸出 (4x4):
* 1 2 3 4
* 12 13 14 5
* 11 16 15 6
* 10 9 8 7
*/
public class SpiralArray {
public static void main(String[] args) {
generateSpiral(4);
}
/**
* 產生指定大小的螺旋陣列
* @param size 陣列維度 (size x size)
*/
private static void generateSpiral(int size) {
int[][] matrix = new int[size][size];
fillSpiral(matrix, size, 0, 0);
printMatrix(matrix);
}
/**
* 遞迴填充螺旋邏輯
* @param matrix 目標陣列
* @param len 當前層邊長
* @param max 目前最大數值
* @param offset 層級偏移量
*/
private static void fillSpiral(int[][] matrix, int len, int max, int offset) {
while (len > 0) {
int step = 0;
// 單圈總步數 = (邊長-1) * 4
for (int i = 0; i < (len - 1) * 4; i++) {
if (i < len - 1) { // 向右
matrix[offset][i + offset] = ++max;
} else if (i < 2 * (len - 1)) { // 向下
matrix[offset + step++][matrix.length - 1 - offset] = ++max;
} else if (i < 3 * (len - 1)) { // 向左
matrix[matrix.length - 1 - offset][(step--) + offset] = ++max;
} else { // 向上
matrix[matrix.length - 1 - (step++) - offset][offset] = ++max;
}
}
// 處理奇數階中心點
if (len == 1) {
matrix[matrix.length / 2][matrix.length / 2] = max + 1;
}
offset++;
len -= 2;
}
}
/**
* 格式化輸出陣列
*/
private static void printMatrix(int[][] matrix) {
for (int[] row : matrix) {
for (int val : row) {
System.out.print(val + "\t");
}
System.out.println();
}
}
}
offset 追蹤當前層級,len 表示剩餘邊長,每圈遞減 2。for 迴圈配合索引區間判斷四個方向,避免多重迴圈嵌套。len == 1 時,陣列為奇數階,需單獨填入中心值。輸入: generateSpiral(5)
輸出:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
此演算法可擴展至非正方形矩陣、逆時針螺旋、或作為迷宮生成、圖像處理的基礎模組。理解邊界收縮與索引映射的關係,有助於解決更多二維平面遍歷問題。