题解 | 挡住洪水

挡住洪水

https://www.nowcoder.com/practice/56e54f4c2e3c4a58abfe76dbc1da1d7e

#include<bits/stdc++.h>
using namespace std;
#define int long long

signed main(){
    int x, y;
    cin >> x >> y;
    char c[x+2][y+2];
    for(int i = 0; i < y+1; i++)
        c[0][i] = '-', c[x+1][i] = '-';
    for(int i = 0; i < x + 1; i++)
        c[i][0] = '-', c[i][y+1] = '-';
    for(int i = 1; i <= x; i++){
        for(int j = 1; j <= y; j++){
            cin >> c[i][j];
        }
    }
    for(int i = 1; i <= x; i++){
        for(int j = 1; j <= y; j++){
            int a = i, b = j;

            bool f = false;
            if(c[a][b] == '0'){
                c[a-1][b] == '-'?f = true:f = f;
                c[a][b+1] == '-'?f = true:f = f;
                c[a+1][b] == '-'?f = true:f = f;
                c[a][b-1] == '-'?f = true:f = f;
            }
            if(f) c[a][b] = '-';

            f = false;
            a = x + 1 - i, b = j;
            if(c[a][b] == '0'){
                c[a-1][b] == '-'?f = true:f = f;
                c[a][b+1] == '-'?f = true:f = f;
                c[a+1][b] == '-'?f = true:f = f;
                c[a][b-1] == '-'?f = true:f = f;
            }
            if(f) c[a][b] = '-';

            f = false;
            a = i, b = y + 1 - j;
            if(c[a][b] == '0'){
                c[a-1][b] == '-'?f = true:f = f;
                c[a][b+1] == '-'?f = true:f = f;
                c[a+1][b] == '-'?f = true:f = f;
                c[a][b-1] == '-'?f = true:f = f;
            }
            if(f) c[a][b] = '-';

            f = false;
            a = x + 1 - i, b = y + 1 - j;
            if(c[a][b] == '0'){
                c[a-1][b] == '-'?f = true:f = f;
                c[a][b+1] == '-'?f = true:f = f;
                c[a+1][b] == '-'?f = true:f = f;
                c[a][b-1] == '-'?f = true:f = f;
            }
            if(f) c[a][b] = '-';
        }
    }
    int ans = 0;
    for(int i = 1; i <= x; i++){
        for(int j = 1; j <= y; j++){
            int f = 0;
            int a = i, b = j;
            if(c[a][b] == '0'){
                ans++;
            }
        }
       // cout << endl;
    }
    cout << ans;
}

先标记上下左右边界为'-',然后再做四次遍历

第一次:从左到右,从上到下。

第二次:从左到右,从下到上。

第三次:从右到左,从上到下。

第四次:从右到左,从下到上。

如果当前元素值为'0',那就比较上下左右是否与外界连通(即上下左右是否为'-'),如果存在至少一个为'-',就标记该元素值为'-',

然后四次遍历足够将所有与外界连通的'0',变为'-'。

这四次遍历可以用一次双循环就行。

然后再计算剩下的'0'的数量就行。

全部评论
点赞 回复 分享
发布于 11-03 22:18 辽宁

相关推荐

爱吃烤肠的牛油最喜欢...:50K是ssp了估计,ssp的人家多厉害都不用说,每年比例大概在百分之5左右
点赞 评论 收藏
分享
10-28 17:30
已编辑
华东交通大学 Java
iori2333:这太正常了 我字节面了四五轮 没有一次是在官网投递 都是hr主动捞
秋招笔试记录
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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