B4557 [GESP202606 四级] 扫雷 题解 题目描述小杨同学正在游玩经典游戏「扫雷」他想自己生成一个「扫雷」的地图。小杨同学希望生成的地图大小为 n 行 m 列一共 n×m 个区块。区块行号为 1,2,⋯,n列号为 1,2,⋯,m。其中一些区块为雷区其它区块不为雷区。小杨同学指定了 q 个区块为雷区而其它区块均不为雷区。小杨同学希望你帮忙计算非雷区的区块每个区块与多少个雷区相邻我们定义区块相邻当且仅当两个区块至少有一个公共顶点也就是说对于不在地图边缘的区块周围 8 个区块均与其相邻。输入格式输入包含 q1 行。第一行三个正整数 n, m 和 q分别表示地图行数和列数以及雷区数量。接下来的 q 行每行有 2 个整数分别表示第 i 个雷区的行号和列号。保证输入的雷区不重复。输出格式输出 n 行每行 m 个字符使用空格分割对于第 i 行第 j 列输出地图对应区块的信息如果为雷区输出*如果不是雷区输出其相邻雷区数量输出 0 到 8 中的一个数字。输入输出样例输入 #1复制3 4 4 1 1 1 3 2 4 3 2输出 #1复制* 2 * 2 2 3 3 * 1 * 2 1说明/提示输出解释 1根据输入在 3×4 的地图上有 4 个雷区分别是 (1,1)(1,3)(2,4) 和 (3,2)如输出样例中*所示其它非雷区区块的相邻雷区数量可以直观看出。数据范围3≤n,m≤500, 1≤q≤n⋅m。输入的雷区必定在地图内且不重复注意行号和列号均从 1 开始。AC代码#include bits/stdc.h using namespace std; int s1[8]{-1,-1,-1,0,1,1,1,0}; int s2[8]{-1,0,1,1,1,0,-1,-1}; int a[505][505],b[505][505]; int main(){ int n,m,q; cinnmq; for(int i1;iq;i){ int lx,ly; cinlxly; a[lx][ly]1; } for(int i1;in;i){ for(int j1;jm;j){ if(a[i][j]1){ continue; } int cnt0; for(int k0;k8;k){ int xis1[k],yjs2[k]; cnta[x][y]; } b[i][j]cnt; } } for(int i1;in;i){ for(int j1;jm;j){ if(a[i][j]1){ cout* ; } else{ coutb[i][j] ; } } coutendl; } return 0; }