首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 二維陣列螺旋填充實作教學

     編輯:Java 相關知識

前言

在演算法練習中,將自然數以螺旋方式填入方陣是經典題目。本文將詳細解析如何使用 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

延伸應用

此演算法可擴展至非正方形矩陣、逆時針螺旋、或作為迷宮生成、圖像處理的基礎模組。理解邊界收縮與索引映射的關係,有助於解決更多二維平面遍歷問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved