扫雷
题目描述
在一个 n 行 m列的方格图上有一些位置有地雷,另外一些位置为空。
请为每个空位置标一个整数,表示周围八个相邻的方格中有多少个地雷。
输入描述
输入的第一行包含两个整数 n, m。
第 2行到第 n+1 行每行包含 m个整数,相邻整数之间用一个空格分隔。如果对应的整数为 0,表示这一格没有地雷。如果对应的整数为 1,表示这一格有地雷。
其中,1≤n,m≤100 分钟后还是在当天。
输出描述
输出 n行,每行 m 个整数,相邻整数之间用空格分隔。
对于没有地雷的方格,输出这格周围的地雷数量。对于有地雷的方格,输出 9。
输入输出样例
示例 1
输入
3 4
0 1 0 0
1 0 1 0
0 0 1 0
输出
2 9 2 1
9 4 9 2
1 3 9 2
模拟
以下是对给定的扫雷程序代码及其执行流程的详细注释:
#include<bits/stdc++.h> // 包括了几乎所有的标准库
using namespace std;
int n,m; // n 表示行数,m 表示列数
int a[110][110],b[110][110]; // a 存储原始地图信息,b 存储输出地图信息
// get 函数计算给定坐标 (x, y) 周围八个方格中地雷的数量
int get(int x,int y)
{
int sum=0; // 用于累加周围地雷的数量
for(int i=x-1;i<=x+1;i++) // 遍历给定方格周围的行
for(int j=y-1;j<=y+1;j++) // 遍历给定方格周围的列
sum+=a[i][j]; // 将周围方格的地雷(如果有)加到 sum 上
return sum; // 返回计算出的地雷数量
}
int main()
{
cin>>n>>m; // 读入行数和列数
// 读入原始地图信息,地雷用 1 表示,无地雷用 0 表示
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j]; // 将地图信息存入数组 a
// 计算每一个方格周围的地雷数量,或者标记方格为有地雷
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j]==1) b[i][j]=9; // 如果当前方格有地雷,标记为 9
else b[i][j]=get(i,j); // 否则,计算并存储周围地雷的数量
// 输出结果
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cout<<b[i][j]<<" "; // 输出每个方格的结果,地雷或周围地雷数
cout<<endl; // 每行输出后换行
}
return 0; // 程序结束
}
程序执行流程:
- 程序开始后,首先读入行数和列数
n
和m
。 - 然后,读入地图信息,其中
1
表示该方格有地雷,0
表示该方格没有地雷。这些信息被存入数组a
中。 - 接着,程序对于地图上的每一个方格,通过
if
判断这个方格是否有地雷:- 如果有地雷(
a[i][j] == 1
),则在输出数组b
的对应位置存储9
。 - 如果没有地雷,则调用
get
函数计算这个方格周围八个方格中的地雷总数,并将这个数值存入数组b
的对应位置。
- 如果有地雷(
- 最后,遍历数组
b
,输出每个方格的值,即每个方格周围的地雷数量或者标记为有地雷(9
),每输出一行后换行。 - 当所有行都输出完毕,程序结束。
这个程序基于暴力枚举的方式来计算每个空方格周围的地雷数,对于有地雷的方格直接输出 9
。这种方法直观且易于实现,但在地图较大时可能会有性能瓶颈。