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

134 阅读4分钟

问题描述

小U面临一个有趣的任务:在一个 n×nn×n 的方阵中填入 11 到 n×nn×n 这些数字,并要求按照蛇形顺序从右上角开始,沿着方阵的边界顺时针进行填充。蛇形填充的特殊排列方式使得每一层数字呈现出波浪形的排列方式。

例如,当 n=4n=4 时,方阵应如下所示:

10 11 12  1
9 16 13  2
8 15 14  3
7  6  5  4

你需要编写程序输出填充后的方阵,确保格式的整齐性。

测试样例

样例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]]

当我们没有思路的时候,可以借助右侧豆包MarsCode帮助解题:

c930db794230653b52bd352f0d968bfb.png

问题理解

你需要在一个 n x n 的方阵中按照蛇形顺序填充数字。蛇形填充的规则是从右上角开始,沿着方阵的边界顺时针进行填充,每一层数字呈现出波浪形的排列方式。

数据结构选择

我们可以使用一个二维列表(即列表的列表)来表示这个 n x n 的方阵。

算法步骤

  1. 初始化方阵:创建一个 n x n 的二维列表,初始值为 0
  2. 确定填充方向:我们需要按照顺时针方向填充数字,因此需要定义四个方向:右、下、左、上。
  3. 填充数字:从右上角开始,按照顺时针方向填充数字,直到所有数字都被填充。
  4. 处理边界条件:在填充过程中,需要注意边界条件,避免越界。

具体步骤

  1. 初始化方向数组:定义四个方向的移动步长,例如 [(0, 1), (1, 0), (0, -1), (-1, 0)] 分别表示右、下、左、上。
  2. 填充数字:从右上角开始,按照当前方向移动,填充数字。如果遇到边界或已经填充过的位置,则改变方向。
  3. 结束条件:当所有位置都被填充后,结束填充过程。

代码实现

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)]
    
    # 初始化当前位置和当前方向
    x, y = 0, n - 1  # 从右上角开始
    current_direction = 0  # 初始方向为右
    
    # 填充数字
    for num in range(1, n * n + 1):
        # 填充当前位置
        matrix[x][y] = num
        
        # 计算下一个位置
        next_x = x + directions[current_direction][0]
        next_y = y + directions[current_direction][1]
        
        # 检查下一个位置是否越界或已经填充过
        if not (0 <= next_x < n and 0 <= next_y < n and matrix[next_x][next_y] == 0):
            # 改变方向
            current_direction = (current_direction + 1) % 4
            next_x = x + directions[current_direction][0]
            next_y = y + directions[current_direction][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]])

易错点及个人思考

  1. 初始位置的选择

一开始我可能会选择从左上角开始填充,但这与题目要求的右上角开始填充不符。需要仔细阅读题目描述,确保初始位置正确。在这个例子中,初始位置应该是 (0, n-1),即右上角。

  1. 方向数组的定义

方向数组的顺序可能会出错,导致填充顺序不对。方向数组的顺序应该是顺时针方向,即 [(0, 1), (1, 0), (0, -1), (-1, 0)],分别表示右、下、左、上。需要确保顺序正确。

  1. 边界条件的检查

在检查下一个位置是否越界或已经填充过时,可能会遗漏某些边界条件。需要确保在改变方向之前,已经正确检查了下一个位置是否越界或已经填充过。可以使用 if not (0 <= next_x < n and 0 <= next_y < n and matrix[next_x][next_y] == 0) 来检查。

  1. 方向改变的逻辑

方向改变的逻辑可能会出错,导致填充顺序不对。方向改变的逻辑应该是 current_direction = (current_direction + 1) % 4,这样可以确保方向在四个方向之间循环。

  1. 填充数字的顺序

填充数字的顺序可能会出错,导致最终结果不符合蛇形填充的要求。需要确保每次填充数字后,正确更新当前位置,并检查下一个位置是否需要改变方向。

通过仔细检查和测试,可以避免这些易错点,确保算法正确实现蛇形填充。

在豆包MarsCode的帮助下,很容易就解决了问题啦

6d61789a0c6cf12192b2559b9240262d.png