Python在O(nm) 时间优雅求解
2025-11-11 16:16:14
发布于:上海
0阅读
0回复
0点赞
本题是经典的扫雷游戏模拟题,核心在于对每个非雷格(?)统计其周围 8 个方向的地雷(*)数量。
我的解法严格遵循题目要求:
- 输入处理:首先读入雷区的行数
n和列数m,然后逐行读取地图字符串,存储为列表rows。 - 逐格判断:遍历每个位置
(y, x):- 若当前格为地雷(
*),直接在结果中保留*; - 若为安全格(
?),则进入统计流程。
- 若当前格为地雷(
- 邻域构建:动态计算上下左右四个方向的有效坐标(通过边界检查
>=0和< 行/列数),分别存入directions_ud(上下行)和directions_lr(左右列)。 - 八方扫描:将当前行列加入邻域列表,形成最多 3×3 的局部区域,遍历其中每个格子,遇到
*则计数加一。 - 类型转换:关键细节——必须将计数值
count转为字符串再存入结果,否则后续''.join()会因类型错误而崩溃!
虽然未使用方向数组等简洁写法,但逻辑清晰、边界处理稳妥,能正确应对各种角落与边缘情况。一行不偷懒,八方皆扫清,这才是扫雷的正确打开方式!
当然可以!以下是你的原始代码加上详细中文注释后的版本,逻辑清晰、便于理解:
python
读取雷区的行数和列数
row_num, col_num = (int(_) for _ in input().split())
读取每一行的雷区地图(每行是一个字符串)
rows = []
for _ in range(row_num):
rows.append(input().strip()) # 使用 strip() 防止末尾换行符干扰
初始化结果列表,每个元素是一个空列表,用于按行存储输出字符
res = [[] for _ in range(row_num)]
遍历雷区中的每一个格子 (y 行, x 列)
for y in range(row_num):
for x in range(col_num):
# 如果当前格子是地雷,直接在结果中放入 ''
if rows[y][x] == '':
res[y].append('')
continue # 跳过后续统计逻辑
# 否则,当前格子是安全格 '?',需要统计周围 8 个方向的地雷数量
count = 0
# 计算上下左右四个方向的坐标
up = y - 1
down = y + 1
left = x - 1
right = x + 1
# 存储有效的上下行索引(排除越界)
directions_ud = []
if up >= 0:
directions_ud.append(up)
if down < row_num:
directions_ud.append(down)
# 存储有效的左右列索引(排除越界)
directions_lr = []
if left >= 0:
directions_lr.append(left)
if right < col_num:
directions_lr.append(right)
# 遍历以 (y, x) 为中心的 3×3 区域(包括自身)
# 注意:虽然包含了自身,但因为当前格是 '?',不会被计为地雷,不影响结果
for pos_x in directions_lr + [x]: # 所有可能的列:左、右、当前列
for pos_y in directions_ud + [y]: # 所有可能的行:上、下、当前行
if rows[pos_y][pos_x] == '': # 如果该位置是地雷
count += 1
# 将地雷数量转为字符串后存入结果(关键!否则 join 会报错)
res[y].append(str(count))
按行输出结果,每行字符拼接成一个字符串
for row in res:
print(''.join(row))
这里空空如也

有帮助,赞一个