在编程中,蛇形填充方阵是一个经典的算法问题,它要求我们在一个 n x n 的方阵中按照特定的蛇形顺序填充数字。这种填充方式从右上角开始,沿着方阵的边界顺时针进行,每一层数字呈现出波浪形的排列方式。本文将详细解析这一算法,并通过代码实现来展示其工作原理。
思路解析
- 初始化方阵:首先,我们需要创建一个
n x n的二维列表(即列表的列表),并将其初始值设为0。这个二维列表将用于存储最终的填充结果。 - 定义方向:蛇形填充需要按照顺时针方向进行,因此我们需要定义四个方向:右、下、左、上。这可以通过一个包含四个元组的列表来实现,每个元组表示一个方向上的行列变化。
- 初始位置:填充从右上角开始,因此初始位置为
(0, n-1)。同时,我们需要一个变量来记录当前的方向索引,初始方向为右。 - 填充数字:从1到
n x n,依次填充数字。对于每个数字,我们首先将其填充到当前位置,然后计算下一个位置。如果下一个位置越界或已经填充过数字,我们需要改变方向,并重新计算下一个位置。 - 处理边界条件:在填充过程中,需要特别注意边界条件,以避免越界错误。当遇到边界时,通过改变方向来继续填充。
图解示例
以 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]])
知识总结
通过本题,我们学习了蛇形填充方阵的算法实现。这一算法的关键在于定义方向、处理边界条件以及按顺序填充数字。在实现过程中,我们使用了二维列表来存储方阵,通过遍历数字并更新当前位置和方向来完成填充。
对于入门同学来说,建议首先理解算法的基本思路,然后通过编写代码来加深理解。在编写代码时,可以逐步调试和验证每一步的结果,以确保算法的正确性。此外,还可以尝试对算法进行优化,例如使用更高效的数据结构或算法来减少时间复杂度。
希望本文能够帮助大家更好地理解和实现蛇形填充方阵的算法。