#include<iostream>
using namespace std;
const int N = 1005;
int st[N][N];
int p[N][N];
int n,m;
int dx[]= {0,1,0,-1},dy[]= {-1,0,1,0};
void dfs(int a,int b) {
p[a][b] = -1; // 即扫过了
for(int i = 0; i< 4; i++) {
int x = dx[i] + a, y = b + dy[i];
if(p[x][y] == 0 && x > 0 && x <= n && y <= m && y >0) {
dfs(x,y);
}
}
}
bool check(int i,int j) {
if(p[i][j]) {
int cnt = 0;
if(p[i-1][j-1] > 0) cnt ++;
if(p[i-1][j] > 0) cnt ++;
if(p[i-1][j+1] > 0) cnt ++;
if(p[i][j-1] > 0) cnt ++;
if(p[i][j+1] > 0 ) cnt ++;
if(p[i+1][j-1] > 0) cnt ++;
if(p[i+1][j] > 0) cnt ++;
if(p[i+1][j+1] > 0) cnt ++;
if(i == 1 && j == 1) {
return cnt == 3;
} else if(i == n && j == m) {
return cnt == 3;
} else if(i == 1 && j==m) {
return cnt == 3;
} else if(i == n && j == 1) {
return cnt ==3;
} else if(i == 1) {
return cnt == 5;
} else if(i == n) {
return cnt == 5;
} else if(j == 1) {
return cnt == 5;
} else if(j == m) {
return cnt == 5;
}
return cnt == 8;
} else {
dfs(i,j);
return true;
}
}
int main() {
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
scanf("%d",&st[i][j]);
}
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
if(st[i][j] == 0) { // 数四周的雷数
if(st[i-1][j-1] == 1) p[i][j] ++;
if(st[i-1][j] == 1) p[i][j] ++;
if(st[i-1][j+1] == 1) p[i][j] ++;
if(st[i][j-1] == 1) p[i][j] ++;
if(st[i][j+1] == 1) p[i][j] ++;
if(st[i+1][j-1] == 1) p[i][j] ++;
if(st[i+1][j] == 1) p[i][j] ++;
if(st[i+1][j+1] == 1) p[i][j] ++;
} else {
p[i][j] = 100; // 是雷就标记为100
}
}
}
// for(int i = 1; i <= n; i++) {
// for(int j = 1; j <= m; j++) {
// cout<< p[i][j] <<' ';
// }
// puts("");
// }
int ans = 0;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
if(st[i][j] == 0) {
if(check(i,j)) {
ans++;
// cout<<i<<' '<<j<<endl;
}
}
}
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
cout<< p[i][j] <<' ';
}
puts("");
}
printf("%d",ans);
return 0;
}
求助求助