题目解析与学习总结:蛇形填充n阶方阵 | 豆包MarsCode AI刷题

144 阅读3分钟

题目描述

在一个 n×n 的方阵中,按照蛇形顺序填充数字 111 到 n×n,要求从方阵的 右上角开始,沿着方阵的边界顺时针方向依次填充数字,直至完成整个方阵的填充。

例如: 当 n=4n = 4n=4 时,方阵结果为:

10  11  12   1

 9  16  13   2

 8  15  14   3

 7   6   5   4

题目解析

1. 蛇形填充特点:

蛇形填充从方阵的右上角开始。

填充顺序按 顺时针方向,即:

1. 从上往下: 沿着最右列填充。

2. 从右往左: 沿着最下行填充。

3. 从下往上: 沿着最左列填充。

4. 从左往右: 沿着最上行填充。

 每完成一圈填充后,边界会向内缩小。

2 解题思路:

  使用二维数组 matrix 存储方阵。

定义四个变量 top, bottom, left, right 表示当前的上下左右边界。

依次按顺时针方向填充数字,并在每个方向的填充后调整边界。

 3.边界条件:

  当填充的数字 num > n * n 时,停止填充。

代码实现(JAVA):

public class Main {
public static int[][] solution(int n) {
    // 初始化一个 n x n 的二维数组
    int[][] matrix = new int[n][n];
    int num = 1; // 当前填充的数字
    int top = 0; // 上边界
    int bottom = n - 1; // 下边界
    int left = 0; // 左边界
    int right = n - 1; // 右边界

    // 当数字小于等于 n * n 时,继续填充
    while (num <= n * n) {
        // 从上往下填充最右列
        for (int i = top; i <= bottom; i++) {
            matrix[i][right] = num++;
        }
        right--; // 缩小右边界

        // 从右往左填充最下行
        for (int j = right; j >= left && num <= n * n; j--) {
            matrix[bottom][j] = num++;
        }
        bottom--; // 缩小下边界

        // 从下往上填充最左列
        for (int i = bottom; i >= top && num <= n * n; i--) {
            matrix[i][left] = num++;
        }
        left++; // 缩小左边界

        // 从左往右填充最上行
        for (int j = left; j <= right && num <= n * n; j++) {
            matrix[top][j] = num++;
        }
        top++; // 缩小上边界
    }
    return matrix; // 返回结果矩阵
}

public static void main(String[] args) {
    int[][] a1 = solution(4);
    System.out.println(java.util.Arrays.deepEquals(a1,
            new int[][] { { 10, 11, 12, 1 }, { 9, 16, 13, 2 }, { 8, 15, 14, 3 }, { 7, 6, 5, 4 } }));

    int[][] a2 = solution(5);
    System.out.println(java.util.Arrays.deepEquals(a2, new int[][] { { 13, 14, 15, 16, 1 }, { 12, 23, 24, 17, 2 },
            { 11, 22, 25, 18, 3 }, { 10, 21, 20, 19, 4 }, { 9, 8, 7, 6, 5 } }));

    int[][] a3 = solution(3);
    System.out.println(java.util.Arrays.deepEquals(a3, new int[][] { { 7, 8, 1 }, { 6, 9, 2 }, { 5, 4, 3 } }));
}

代码详解

1.初始化矩阵与边界:

matrix[i][j] 用于存储填充结果。

top, bottom, left, right 分别表示当前待填充区域的上下左右边界。

2.顺时针填充:

从上往下: 沿右边界,从 top 到 bottom,逐行填充。

从右往左: 沿下边界,从 right 到 left,逐列填充。

从下往上: 沿左边界,从 bottom 到 top,逐行填充。

从左往右: 沿上边界,从 left 到 right,逐列填充。

每次填充后,调整边界范围,缩小下一圈填充的范围。

3.填充终止条件:

数字 num 超过 n×n 时,停止填充。

个人思考与分析

1.边界控制的关键:

填充矩阵时,边界的动态调整(缩小范围)是本题的核心,利用 top、bottom、left、right 四个变量明确边界可以有效避免混乱。

2.解决难点:

处理多方向的填充逻辑时,需明确每个方向的起始条件与结束条件,尤其是防止越界或重复填充的问题。

3.个人收获:

学习了如何在矩阵中按规则填充数据,尤其是蛇形填充这种顺序复杂的逻辑问题。

理解了边界动态控制与循环嵌套的应用技巧。