题目来源
扫雷 https://www.lanqiao.cn/problems/549/learning/
建议自己先做,再看题解
题目描述
在一个 n 行 m 列的方格图上有一些位置有地雷,另外一些位置为空。
请为每个空位置标一个整数,表示周围八个相邻的方格中有多少个地雷。
输入描述
输入的第一行包含两个整数 n,m。
第 2 行到第 n+1 行每行包含 m 个整数,相邻整数之间用一个空格分隔。
如果对应的整数为 0,表示这一格没有地雷。
如果对应的整数为 1,表示这一格有地雷。
其中,1≤n,m≤100
输出描述
输出 n 行,每行 m 个整数,相邻整数之间用空格分隔。
对于没有地雷的方格,输出这格周围的地雷数量。对于有地雷的方格,输出 9
解题思路
辅助图
上图所示为每个方格图的坐标(行数,列数),有边框的是n行m列方格图,然后在此基础上再向外扩展一行一列,扩展部分都填0,这是为了使n行m列方格的边缘部分的周围也有八个相邻的方格,你想,如果不进行扩展,边缘的方格的周围是不是 不是八个相邻的方格,而是:
所以我们对原n行m列方格图进行扩展,让所有方格都有八个周围方格,扩展部分都填0,接下来用二维数组count[n][m]计数,如果c中某位置存储的是1,count对应位置就存储9;如果c中某位置存储的是0, count中对应位置就存储c周围8个位置的数据之和。
代码
#include<iostream>
using namespace std;
int main(){
int n,m,c[102][102],count[102][102];//因为 1≤n,m≤100,而且我们要进行扩展,所以c和count至少102行102列
cin>>n>>m;
//往c中填入0 1
for(int i=1;i<n+1;i++){
for(int j=1;j<m+1;j++){
cin>>c[i][j];
}
}
//先扩展上下
for(int s=0;s<m+2;s++){
c[0][s]=0;
c[n+1][s]=0;
}
//再扩展左右
for(int k=1;k<n+1;k++){
c[k][0]=0;
c[k][m+1]=0;
}
//计数
for(int i=1;i<n+1;i++){
for(int j=1;j<m+1;j++){
//如果c中存储的不是0,即此位置有地雷,count中填入9
if(c[i][j]) count[i][j]=9;
//如果c中存储的是0,即此位置无地雷,count中填入c周围八个存储数据之和,即周围地雷数
else count[i][j]=c[i-1][j-1]+c[i-1][j]+c[i-1][j+1]+c[i][j-1]+c[i][j+1]+c[i+1][j-1]+c[i+1][j]+c[i+1][j+1];
}
}
//输出
for(int i=1;i<n+1;i++){
for(int j=1;j<m+1;j++){
cout<<count[i][j]<<" ";
}
cout<<endl;
}
return 0;
}