题解 | 挡住洪水
挡住洪水
https://www.nowcoder.com/practice/56e54f4c2e3c4a58abfe76dbc1da1d7e
#include <stdio.h>
int main(void) {
int n, m;
scanf("%d%d", &n, &m);
char ch[505][505];
for (int i = 0; i < n; i++)
scanf("%s", ch[i]);
int front = 0, rear = 0;
int vis[505][505] = { 0 };
int qx[505 * 505], qy[505 * 505];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (i == 0 || i == n - 1 || j == 0 || j == m - 1) {
if (ch[i][j] == '0' && !vis[i][j]) {
vis[i][j] = 1;
qx[rear] = i, qy[rear] = j;
rear++;
}
}
}
}
while (front < rear) {
int x = qx[front];
int y = qy[front];
front++;
int dx[4] = {1, 0, 0, -1};
int dy[4] = {0, 1, -1, 0};
for (int k = 0; k < 4; k++) {
int cur_x = x + dx[k];
int cur_y = y + dy[k];
if (cur_x >= 0 && cur_x < n && cur_y >= 0 && cur_y < m) {
if (ch[cur_x][cur_y] == '0' && !vis[cur_x][cur_y]) {
vis[cur_x][cur_y] = 1;
qx[rear] = cur_x;
qy[rear] = cur_y;
rear++;
}
}
}
}
int ans = 0;
for (int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
if(ch[i][j] == '0' && !vis[i][j])
ans++;
printf("%d", ans);
return 0;
}


