题目描述
在一个 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.个人收获:
学习了如何在矩阵中按规则填充数据,尤其是蛇形填充这种顺序复杂的逻辑问题。
理解了边界动态控制与循环嵌套的应用技巧。