测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A18371. 扫雷

填空题 较难

题目描述

扫雷

题目描述

小杨同学正在游玩经典游戏「扫雷」,他想自己生成一个「扫雷」的地图。

小杨同学希望生成的地图大小为 n 行 m 列,一共  n * m 个区块。

区块行号为1,2,,,n ,列号为 1,2,,,m。

其中一些区块为雷区,其它区块不为雷区。

小杨同学指定了q个区块为雷区,而其它区块均不为雷区。小杨同学希望你帮忙计算非雷区的区块,每个区块与多少个雷区相邻?

我们定义区块相邻,当且仅当两个区块至少有一个公共顶点(也就是说对于不在地图边缘的区块,周围8个区块均与其相邻)。

输入格式

输入包含 q+1 行。

第一行,三个正整数 n,m 和 q,分别表示地图行数和列数,以及雷区数量。

接下来的 q 行,每行有2个整数,分别表示第 i 个雷区的行号和列号。

保证输入的雷区不重复。

输出格式

输出 n 行,每行 m 个字符(使用空格分割),对于第 i 行第 j 列,输出地图对应区块的信息:

1. 如果为雷区,输出 * ;

2. 如果不是雷区,输出其相邻雷区数量(输出 0 到 8 中的一个数字)。

输入样例

3 4 4
1 1
1 3
2 4
3 2

输出样例

* 2 * 2
2 3 3 *
1 * 2 1

输出解释

根据输入,在 3*4 的地图上有 4 个雷区,分别是(1,1),(1,3) ,(2,4)和 (3,2),如输出样例中 * 所示,其它非雷区区块的相邻雷区数量可以直观看出。


参考答案

#include <iostream> using namespace std; int mp[510][510]; int main() { int n, m, q; cin >> n >> m >> q; for (int i = 0; i < q; ++i) { int x, y; cin >> x >> y; mp[x-1][y-1] = -1; } for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { if (mp[i][j] == -1) { cout << '*' << ' '; continue; } for (int di = -1; di <= 1; ++di) { for (int dj = -1; dj <= 1; ++dj) { if (i + di < 0 || i + di >= n || j + dj < 0 || j + dj >= m) continue; if (mp[i+di][j+dj] == -1) mp[i][j] += 1; } } cout << mp[i][j] << ' '; } cout << '\n'; } return 0; }
上一题 下一题