蛇形填充方阵问题:从思路到代码与知识总结 | 豆包MarsCode AI刷题

298 阅读3分钟

在编程中,蛇形填充方阵是一个经典的算法问题,它要求我们在一个 n x n 的方阵中按照特定的蛇形顺序填充数字。这种填充方式从右上角开始,沿着方阵的边界顺时针进行,每一层数字呈现出波浪形的排列方式。本文将详细解析这一算法,并通过代码实现来展示其工作原理。

思路解析

  1. 初始化方阵:首先,我们需要创建一个 n x n 的二维列表(即列表的列表),并将其初始值设为0。这个二维列表将用于存储最终的填充结果。
  2. 定义方向:蛇形填充需要按照顺时针方向进行,因此我们需要定义四个方向:右、下、左、上。这可以通过一个包含四个元组的列表来实现,每个元组表示一个方向上的行列变化。
  3. 初始位置:填充从右上角开始,因此初始位置为 (0, n-1)。同时,我们需要一个变量来记录当前的方向索引,初始方向为右。
  4. 填充数字:从1到 n x n,依次填充数字。对于每个数字,我们首先将其填充到当前位置,然后计算下一个位置。如果下一个位置越界或已经填充过数字,我们需要改变方向,并重新计算下一个位置。
  5. 处理边界条件:在填充过程中,需要特别注意边界条件,以避免越界错误。当遇到边界时,通过改变方向来继续填充。

图解示例

以 n=4 为例,蛇形填充的过程可以表示为:

初始状态:
[[0, 0, 0, 0],
 [0, 0, 0, 0],
 [0, 0, 0, 0],
 [0, 0, 0, 0]]
 
填充过程:
10 11 12  1  (右->下->左->上)
 9 16 13  2  (右->下->左)
  8 15 14  3  (右->下->上)
   7  6  5  4  (右)

代码详解

以下是实现蛇形填充方阵的Python代码:

def solution(n: int) -> list:
    # 初始化一个 n x n 的二维列表,初始值为 0
    matrix = [[0] * n for _ in range(n)]
    
    # 定义四个方向:右、下、左、上
    directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]
    
    # 初始位置为右上角 (0, n-1)
    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]])

知识总结

通过本题,我们学习了蛇形填充方阵的算法实现。这一算法的关键在于定义方向、处理边界条件以及按顺序填充数字。在实现过程中,我们使用了二维列表来存储方阵,通过遍历数字并更新当前位置和方向来完成填充。

对于入门同学来说,建议首先理解算法的基本思路,然后通过编写代码来加深理解。在编写代码时,可以逐步调试和验证每一步的结果,以确保算法的正确性。此外,还可以尝试对算法进行优化,例如使用更高效的数据结构或算法来减少时间复杂度。

希望本文能够帮助大家更好地理解和实现蛇形填充方阵的算法。