旨在为小朋友们提供全面的学习材料,共同为等级考试做好准备。
添加小助手微信,回复【GESP四级2026.06_扫雷】,获取本题源代码。
【提交】
https://www.luogu.com.cn/problem/B4557
【问题描述】
小杨同学正在游玩经典游戏「扫雷」,他想自己生成一个「扫雷」的地图。
小杨同学希望生成的地图大小为 行 列,一共 个区块。
区块行号为 ,列号为 。 其中一些区块为雷区,其它区块不为雷区。
小杨同学指定了 个区块为雷区,而其它区块均不为雷区。小杨同学希望你帮忙计算非雷区的区块,每个区块与多少个雷区相邻?
我们定义区块相邻,当且仅当两个区块至少有一个公共顶点(也就是说对于不在地图边缘的区块,周围 个区块均与其相邻)。
【输入描述】
输入包含 行。第一行,三个正整数 , 和 ,分别表示地图行数和列数,以及雷区数量。接下来的 行,每行有 个整数,分别表示第 个雷区的行号和列号。
保证输入的雷区不重复。
【输出描述】
输出 行,每行 个 字符(使用空格分割),对于第 行第 列,输出地图对应区块的信息:
*;【样例输入1】
3 4 41 11 32 43 2【样例输出1】
* 2 * 22 3 3 *1 * 2 1【样例解释1】
根据输入,在 的地图上有 个雷区,分别是 ,, 和 ,如输出样例中 * 所示,其它非雷区区块的相邻雷区数量可以直观看出。
【数据范围】
。
输入的雷区必定在地图内且不重复,注意行号和列号均从 开始。
参考程序:
'''[GESP202606 四级] 扫雷https://www.luogu.com.cn/problem/B4557'''n, m, q = map(int, input().split())# 初始化:雷标记矩阵 + 计数矩阵(多一圈避免边界判断)lst = [[0for _ in range(m + 2)] for _ in range(n + 2)]for _ in range(q): i, j = map(int, input().split()) lst[i][j] = '*'dx = [-1, -1, -1, +0, +0, +1, +1, +1]dy = [-1, +0, +1, -1, +1, -1, +0, +1]for i in range(1, n + 1):for j in range(1, m + 1):if lst[i][j] != "*": cnt = 0for k in range(8): x = i + dx[k] y = j + dy[k]if lst[x][y] == "*": cnt += 1 lst[i][j] = cntfor i in range(1, n + 1):for j in range(1, m + 1): print(lst[i][j], end=" ") print()青少年编程竞赛交流
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),添加小助手微信,让他邀请大家进入学习群。进群之后大家可以参与定期组织的 #21天刷题打卡、 #GESP编程能力测评、 #青少年编程等级考试、 #教育部白名单比赛辅导 以及 #青少年编程组队竞赛 等活动。
