Python扫雷网格转换功能求助:将无雷位替换为周围地雷数
实现扫雷网格的地雷计数功能
核心思路
要完成这个功能,核心就是遍历网格的每个单元格,对无雷区域统计其8个相邻方向的地雷数量,具体步骤如下:
- 逐个检查网格中的每个位置
- 如果当前位置是地雷(
#),直接保留原符号 - 如果是无雷区域(
-),遍历其上下左右、四个对角线的8个相邻位置,统计其中地雷的总数,将数字转为字符串替换原符号 - 注意处理边界情况:当单元格在网格边缘或角落时,要跳过超出网格范围的位置,避免索引错误
代码实现(Python)
以下是针对5×5网格的完整实现代码:
def mine_sweeper(grid): rows = len(grid) if rows == 0: return [] cols = len(grid[0]) result = [] # 定义8个相邻方向的坐标偏移量 directions = [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)] for i in range(rows): current_row = [] for j in range(cols): # 遇到地雷直接加入结果 if grid[i][j] == '#': current_row.append('#') else: mine_count = 0 # 遍历所有相邻方向 for dx, dy in directions: x = i + dx y = j + dy # 检查坐标是否在网格有效范围内 if 0 <= x < rows and 0 <= y < cols: if grid[x][y] == '#': mine_count += 1 # 将计数转为字符串加入结果行 current_row.append(str(mine_count)) result.append(current_row) return result
测试示例
假设你的5×5输入网格是:
input_grid = [ ["-", "-", "-", "#", "#"], ["-", "#", "-", "-", "-"], ["-", "-", "-", "-", "-"], ["#", "-", "#", "-", "-"], ["-", "-", "-", "-", "-"] ]
调用函数并打印结果:
output = mine_sweeper(input_grid) for row in output: print(row)
输出结果为:
['1', '1', '2', '#', '#'] ['1', '#', '2', '2', '2'] ['2', '2', '3', '1', '1'] ['#', '2', '#', '1', '0'] ['1', '1', '1', '1', '0']
关键细节说明
- 方向偏移量:用一个列表存储8个方向的坐标变化,确保不会漏掉任何相邻的地雷
- 边界检查:通过
0 <= x < rows和0 <= y < cols判断坐标是否合法,避免出现索引越界错误 - 原网格保护:创建独立的结果网格,不会修改输入的原始网格数据
内容的提问来源于stack exchange,提问作者user20677321
相关产品推荐
相关产品推荐

