如何实现蛇形遍历二维网格并生成坐标路径

本文介绍如何编写一个函数,对嵌套列表表示的二维网格进行蛇形(之字形)遍历:偶数行从左到右、奇数行从右到左,返回每个访问位置的 (列索引, 行索引) 坐标元组列表。

在网格遍历类问题中,“蛇形路径”(zigzag or serpentine order)是一种常见模式:它要求遍历行为随行号奇偶性动态切换方向。关键在于——方向控制应作用于列索引序列,而非原始数据本身。原代码中的错误正在于此:它对 row(某一行的数据)调用了 reverse_list,但后续仍用 range(len(reverse_row)) 生成列索引,这实际上完全忽略了 reverse_row 的内容,导致奇数行仍按 (0,i), (1,i), ... 顺序添加坐标,与预期的反向遍历(如 (4,i), (3,i), ...)不符。

正确做法是:为每一行生成标准列索引列表 col_indices = list(range(len(row))),再根据行号奇偶性决定是否对其索引序列进行反转。这样既能保持坐标语义清晰((column, row)),又能精准控制移动顺序。

以下是修正后的完整实现:

def reverse_list(input_list):
    return input_list[::-1]

def student_function(field):
    plough_movements = []

    for row_index, row in enumerate(field):
        col_indices = list(range(len(row)))  # 标准列索引 [0, 1, 2, ..., len(row)-1]

        if row_index % 2 == 0:
            # 偶数行(0, 2, 4...):正向遍历 → (0, r), (1, r), (2, r), ...
            plough_movements.extend([(col, row_index) for col in col_indices])
        else:
            # 奇数行(1, 3, 5...):反向遍历 → (len-1, r), (len-2, r), ..., (0, r)
            reversed_cols = reverse_list(col_indices)
            plough_movements.extend([(col, row_index) for col in reversed_cols])

    return plough_movements

验证示例
假设 field = [[0,1,2,3,4], [0,1,2,3,4], [0,1,2,3,4]](3 行 × 5 列),则输出为:
[(0,0),(1,0),(2,0),(3,0),(4,0), (4,1),(3,1),(2,1),(1,1),(0,1), (0,2),(1,2),(2,2),(3,2),(4,2)]
完全符合“偶行左→右、奇行右→左”的蛇形坐标路径。

⚠️ 注意事项

  • 坐标格式为 (column, row)(非 (row, column)),这是由题目示例结果明确规定的(如 (0,0), (1,4) 等均体现列在前、行在后);
  • field 是一个非空嵌套列表,每行长度可不等,但代码已通过 len(row) 动态适配;
  • reverse_list 函数虽可直接用 reversed() 或切片替代,但保留它体现了模块化与复用设计意图;
  • 时间复杂度为 O(N)(N 为总单元格数),空间复杂度为 O(1)(除输出列表外无额外增长空间)。

该实现简洁、可读性强,且严格满足题目对路径方向与坐标格式的双重约束,适用于自动化耕作模拟、矩阵扫描、UI 渲染序等实际场景。