题解 | 挡住洪水

挡住洪水

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;
}

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务