题目:
###本题目主要考察的是模拟
#include<bits/stdc++.h>
using namespace std;
const int N=150;
int a[N][N],b[N][N];
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
cin>>a[i][j];
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
//有雷变9,该位置则不扫描,跳过
if(a[i][j]){
b[i][j]=9;
continue;
}
//扫描地雷,边界问题用max函数和min函数解决,不需要罗列条件
for(int _i=max(1,i-1);_i<=min(n,i+1);++_i){
for(int _j=max(1,j-1);_j<=min(m,j+1);++_j){
if(a[_i][_j]){
b[i][j]++;
}
}
}
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
cout<<b[i][j]<<' ';
}
cout<<'\n';
}
return 0;
}
整体思路:
- 首先开两个二维数组a,b,根据题目要求将数据输入
- 用双重for循环对a的每行每列进行搜索,如果有雷的话将b的该位置置为9,并且不要扫描直接跳出循环,否则扫描该位置有多少个雷
- 扫描需要考虑到特殊情况(边界时),罗列条件的话太过复杂,这里可以直接用max和min函数来解决,将扫描的上下界锁死(比如:边界够大时,我要扫描a[3,3]位置,那么_i=2,判断条件是_i<=4,同理_j=2,判断条件是_j<=4,特殊情况:要考虑边界时,扫描a[1,1]位置时,max就会将边界锁在下标1)
- 最后,将b数组输出即可
###括号有点多不要看串了