问题描述
小U面临一个有趣的任务:在一个 𝑛×𝑛n×n 的方阵中填入 11 到 𝑛×𝑛n×n 这些数字,并要求按照蛇形顺序从右上角开始,沿着方阵的边界顺时针进行填充。蛇形填充的特殊排列方式使得每一层数字呈现出波浪形的排列方式。
例如,当 𝑛=4n=4 时,方阵应如下所示:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
你需要编写程序输出填充后的方阵,确保格式的整齐性。 import java.util.Arrays;
public class Main { public static int[][] solution(int n) { int[][] matrix = new int[n][n]; int value = n * n; int row = 0, col = n - 1; boolean moveUp = false;
while (value >= 1) {
// Fill the top row from right to left
while (col >= 0 && matrix[row][col] == 0) {
matrix[row][col--] = value--;
}
col++;
row++;
// Fill the left column from top to bottom
while (row < n && matrix[row][col] == 0) {
matrix[row++][col] = value--;
}
row--;
col--;
// Fill the bottom row from left to right
while (col >= 0 && matrix[row][col] == 0) {
matrix[row][col++] = value--;
}
col--;
row--;
// Fill the right column from bottom to top
while (row >= 0 && matrix[row][col] == 0) {
matrix[row--][col] = value--;
}
row++;
col++;
}
return matrix;
}
public static void main(String[] args) {
int[][] a1 = solution(4);
System.out.println(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(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(Arrays.deepEquals(a3, new int[][]{{7, 8, 1}, {6, 9, 2}, {5, 4, 3}}));
}
} 蛇形矩阵的填充算法可以通过以下步骤实现:
- 初始化一个
n×n的矩阵,所有元素初始为0。 - 设置一个变量
value,初始值为n*n,表示即将填充的数值。 - 使用两个变量
row和col来表示当前填充的位置,初始时设置在矩阵的右上角。 - 使用一个布尔变量
moveUp来控制填充方向,初始为false,表示初始填充方向是从上到下。 - 通过循环填充矩阵,每次循环填充一行或一列,直到
value减到1。 - 在每次填充后,根据当前填充方向和位置,更新
row和col的值,以及填充方向。这段代码将创建一个蛇形矩阵,并且按照题目要求的方式填充。在main方法中,我们通过Arrays.deepEquals方法来比较输出矩阵和预期矩阵是否相同,从而验证算法的正确性。