问题描述
小U面临一个有趣的任务:在一个 n×nn×n 的方阵中填入 11 到 n×nn×n 这些数字,并要求按照蛇形顺序从右上角开始,沿着方阵的边界顺时针进行填充。蛇形填充的特殊排列方式使得每一层数字呈现出波浪形的排列方式。
例如,当 n=4n=4 时,方阵应如下所示:
你需要编写程序输出填充后的方阵,确保格式的整齐性。
问题理解
我们需要在一个 n x n 的方阵中按照蛇形顺序填充数字。蛇形填充的特殊之处在于每一层数字呈现出波浪形的排列方式,从右上角开始,沿着方阵的边界顺时针进行填充。
数据结构选择
我们可以使用一个二维列表(矩阵)来表示这个 n x n 的方阵。
算法步骤
-
初始化矩阵:创建一个
n x n的矩阵,并将其所有元素初始化为0。 -
定义方向数组:我们需要定义一个方向数组来表示移动的方向。由于是顺时针填充,方向数组可以定义为
[(0, 1), (1, 0), (0, -1), (-1, 0)],分别表示右、下、左、上。 -
初始位置和方向:从右上角开始填充,即初始位置为
(0, n-1),初始方向为右。 -
填充数字:
- 从
1到n * n依次填充数字。 - 每次填充一个数字后,计算下一个位置。
- 检查下一个位置是否越界或已经填充过。如果是,则改变方向。
- 更新当前位置。
- 从
-
返回结果:填充完成后,返回矩阵。
关键点
方向控制:如何正确地改变方向以实现蛇形填充。
边界检查:确保下一个位置在矩阵范围内且未被填充过。
def solution(n: int) -> list:
# 初始化 n x n 的矩阵
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]])
通过