Python二维列表扫雷实现:基于深拷贝的正确方案
扫雷相邻计数函数(深拷贝合规版)
需求回顾
- 输入:二维列表构成的网格,其中
#表示地雷,-表示无雷点位 - 输出:新网格,所有无雷点位需要替换为自身周围8个方向(水平、垂直、对角线)相邻的地雷总数
- 强制约束:必须通过深拷贝输入网格的方式生成输出,函数执行全程不能修改原始输入网格
原有代码问题
原有实现虽然没有直接修改原始输入,但新网格是通过初始化全#值的空白二维列表生成的,没有遵循「深拷贝输入网格生成输出」的要求,同时空输入分支会返回None,存在边界逻辑问题。
修正方案
使用Python标准库copy模块的deepcopy方法对输入网格做完整深拷贝,基于这个和原网格完全独立的副本做后续计数修改,从根源上隔离原始输入和输出对象,既完全避免原始输入被篡改的可能,也符合深拷贝生成输出的要求。
最终可运行代码
import copy def mines_adj(grid): n = len(grid) if n == 0: return [] # 深拷贝输入网格作为输出基底,与原网格完全独立无引用关联 newgrid = copy.deepcopy(grid) # 8个相邻方向的坐标偏移量 directions = ((-1, 0), (1, 0), (0, -1), (0, 1), (-1, -1), (-1, 1), (1, -1), (1, 1)) m = len(grid[0]) for r in range(n): for c in range(m): if grid[r][c] == "-": mine_count = 0 for dr, dc in directions: nr, nc = r + dr, c + dc # 越界校验+相邻位地雷判断 if 0 <= nr < n and 0 <= nc < m and grid[nr][nc] == "#": mine_count += 1 newgrid[r][c] = mine_count return newgrid # 功能测试 if __name__ == "__main__": grid = [["-", "-", "-", "#", "#"], ["-", "#", "-", "-", "-"], ["-", "-", "#", "-", "-"], ["-", "#", "#", "-", "-"], ["-", "-", "-", "-", "-"]] result = mines_adj(grid) print("原始网格(未被修改):") for row in grid: print(row) print("\n地雷计数结果网格:") for row in result: print(row)
合规性说明
copy.deepcopy会递归复制网格所有层级的对象,生成的新网格和原网格不存在任何共享引用,修改新网格的任何值都不会影响原始输入- 计数逻辑全程读取未做任何改动的原始网格做判断,不会出现计数偏差
- 修复了原代码空输入返回
None的边界bug
内容的提问来源于stack exchange,提问作者Sue Ndlovu
相关产品推荐
相关产品推荐

