首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

螺旋矩陣生成算法:Java 實現數字順時針填充 N×N 矩陣

     編輯:程式設計疑難解答

題目需求

輸入 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 代碼。

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