这是一道扫雷游戏的区域数字填充题,核心是计算每个非地雷格周围8个方向的地雷数量。以下是解题思路与代码实现:

解题思路

  1. 输入读取:获取雷区的行数n、列数m,以及n行的雷区布局(*表示地雷,?表示非地雷)。
  2. 遍历每个格子
    • 若当前格子是地雷(*),直接输出*
    • 若当前格子是非地雷,统计其8个相邻方向(上/下/左/右/左上/右上/左下/右下) 中合法范围内的地雷数量。
  3. 边界处理:相邻方向的格子需处于0 ≤ 行 < n0 ≤ 列 < m的合法范围内,避免越界。

代码实现

# 读取输入的行数和列数
n, m = map(int, input().split())
# 读取雷区布局
grid = [input().strip() for _ in range(n)]
# 定义8个相邻方向的偏移量
directions = [(-1, -1), (-1, 0), (-1, 1),
              (0, -1),          (0, 1),
              (1, -1),  (1, 0), (1, 1)]

# 遍历每个格子
for i in range(n):
    result = []
    for j in range(m):
        if grid[i][j] == '*':
            # 当前是地雷,直接加入结果
            result.append('*')
        else:
            # 统计周围地雷数量
            count = 0
            for di, dj in directions:
                ni = i + di
                nj = j + dj
                # 判断相邻格子是否在合法范围内
                if 0 <= ni < n and 0 <= nj < m:
                    if grid[ni][nj] == '*':
                        count += 1
            result.append(str(count))
    # 输出当前行的结果(无分隔符)
    print(''.join(result))

关键代码

# 如何理解:
grid = [input().strip() for _ in range(n)]

# 相当于:
# 1. 初始化一个空列表
grid = []

# 2. 循环 n 次
for _ in range(n):
    # 3. 在每次循环中,读取一行输入并去除首尾空白
    line = input().strip()
    # 4. 将处理后的行添加到列表中
    grid.append(line)