【正经题解】扫雷游戏题解
2026-07-06 11:42:06
发布于:江苏
17阅读
0回复
0点赞
题目大意
输入格式
第一行三个整数n,m,q,分别表示地图的长,宽以及雷区的数量。接下来q行,每行两个整数x,y,表示雷区的位置。
输出格式
一个n * m的数组,如果是雷区那么输出*,否则输出与他相邻的雷区的数量。
注意:相邻是指该格的上,下,左,右,左上,右上,左下,右下。
数据范围
3 <= n,m <= 500 , 1 <= q <= n*m
思路分析
定义三个变量n,m,q和一个char类型的二维数组。输入n,m,q。
for循环从1到q,每次定义两个整数x,y并输入,把雷区的位置标记好。
定义dfs函数,标记不是雷区的位置的相邻位置有多少个雷区。
双层for循环,判断如果非雷区则将该位置定义为dfs(i,j) + '0'。输出。
代码实现
- 定义
int n,m,q;
cin >> n >> m >> q;
char a[510][510];
- for循环输入并标记
for ( int i = 1; i <= q; i++ ){
int x,y;
cin >> x >> y;
a[x][y] = '*';
}
- 定义dfs函数
(为了方便写代码,这里定义两个数组,分别存储八个方位信息)
int x1[10] = {0,0,0,-1,1,-1,1,-1,1};
int y2[10] = {0,1,-1,0,0,-1,1,1,-1};
int dfs( int x , int y ){
int cnt = 0;
for ( int i = 1; i <= 8; i++ ){
if ( x + x1[i] > n || y + y2[i] > m || x + x1[i] < 1 || y + y2[i] < 1 ){
continue;
}
if ( a[x+x1[i]][y+y2[i]] == '*' ){
cnt++;
}
}
return cnt;
}
(提示:这里定义n,m,q,数组a要在dfs函数上面)
4.输出
for ( int i = 1; i <= n; i++ ){
for ( int j = 1; j <= m; j++ ){
if ( a[i][j] != '*' ){
a[i][j] = dfs(i,j) + '0';
}
cout << a[i][j] << ' ';
}
cout << endl;
}
- 完整代码
#include<bits/stdc++.h>
using namespace std;
char a[510][510];
int n,m,q;
int x1[10] = {0,0,0,-1,1,-1,1,-1,1};
int y2[10] = {0,1,-1,0,0,-1,1,1,-1};
int dfs( int x , int y ){
int cnt = 0;
for ( int i = 1; i <= 8; i++ ){
if ( x + x1[i] > n || y + y2[i] > m || x + x1[i] < 1 || y + y2[i] < 1 ){
continue;
}
if ( a[x+x1[i]][y+y2[i]] == '*' ){
cnt++;
}
}
return cnt;
}
int main(){
cin >> n >> m >> q;
for ( int i = 1; i <= q; i++ ){
int x,y;
cin >> x >> y;
a[x][y] = '*';
}
for ( int i = 1; i <= n; i++ ){
for ( int j = 1; j <= m; j++ ){
if ( a[i][j] != '*' ){
a[i][j] = dfs(i,j) + '0';
}
cout << a[i][j] << ' ';
}
cout << endl;
}
return 0;
}
最后
都看到这了,点个赞呗!!!
这里空空如也



有帮助,赞一个