蛇形填充n阶方阵| 豆包MarsCode AI刷题

164 阅读3分钟

题目要求:

小U面临一个有趣的任务:在一个 n×n 的方阵中填入 1 到 n×n 这些数字,并要求按照蛇形顺序从右上角开始,沿着方阵的边界顺时针进行填充。蛇形填充的特殊排列方式使得每一层数字呈现出波浪形的排列方式。例如,当 n=4 时,方阵应如下所示: 10 11 12 1 9 16 13 2 8 15 14 3 7 6 5 4 你需要编写程序输出填充后的方阵,确保格式的整齐性。

题目难度:

简单

解题语言:

python

题给样例:

样例1:

输入:n = 4
输出:[[10, 11, 12, 1], [9, 16, 13, 2], [8, 15, 14, 3], [7, 6, 5, 4]]

样例2:

输入:n = 5
输出:[[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]]

样例3:

输入:n = 3
输出:[[7, 8, 1], [6, 9, 2], [5, 4, 3]]

解题思路

  1. 初始化矩阵:创建一个 n x n 的矩阵,并初始化为 0.

  2. 定义填充方向:我们需要定义四个方向:右、下、左、上。

  3. 填充数字:从右上角开始,按照蛇形顺序填充数字。

  4. 边界处理:在填充过程中,需要注意边界条件和已经填充过的位置。

细节提示:

如何处理边界条件?边界条件处理思路是什么?

处理边界条件是确保算法正确填充矩阵的关键步骤。我们需要确保在填充过程中,不会超出矩阵的边界,并且不会覆盖已经填充过的位置。

检查下一个位置是否在矩阵范围内:确保 next_x 和 next_y 都在 0 到 n-1 之间。 检查下一个位置是否已经被填充:确保 matrix[next_x][next_y] 为 0,表示该位置尚未被填充。

注意:

1.计算下一个位置:根据当前方向计算下一个位置 (next_x, next_y)。 2.检查边界条件: 确保 next_x 和 next_y 都在 0 到 n-1 之间。 确保 matrix[next_x][next_y] 为 0,表示该位置尚未被填充。 3.改变方向:如果下一个位置超出边界或已经被填充,则改变方向。

初始化矩阵:

使用列表推导式创建一个 n x n 的矩阵,所有元素初始化为 0。

定义方向:

使用一个列表存储四个方向的偏移量。

填充数字:

从右上角开始,按照当前方向填充数字,并在需要时改变方向。

边界检查:

在改变方向之前,检查下一个位置是否在矩阵范围内且未被填充。

解答代码:

def solution(n: int) -> list:

matrix = [[0] * n for _ in range(n)]

directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]


x, y = 0, n - 1
direction_index = 0


for num in range(1, n * n + 1):
    matrix[x][y] = num
    

    next_x = x + directions[direction_index][0]
    next_y = y + directions[direction_index][1]
    
   
    if not (0 <= next_x < n and 0 <= next_y < n and matrix[next_x][next_y] == 0):
     
        direction_index = (direction_index + 1) % 4
        next_x = x + directions[direction_index][0]
        next_y = y + directions[direction_index][1]
    
  
    x, y = next_x, next_y

return matrix

if __name__ == '__main__':
print(solution(4) == [[10, 11, 12, 1], [9, 16, 13, 2], [8, 15, 14, 3], [7, 6, 5, 4]])
print(solution(5) == [[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]])
print(solution(3) == [[7, 8, 1], [6, 9, 2], [5, 4, 3]])