You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 18:27:34