1020.飞地的数量

题目

1020.飞地的数量

题目大意

给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格、1 表示一个陆地单元格。

一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid 的边界。

返回网格中 无法 在任意次数的移动中离开网格边界的陆地单元格的数量。

样例

image-20220212195936295

数据规模

image-20220212195943963

思路

题目的意思就是求有多少个陆地单元格无法到达四周边缘。那其实可以考虑四周边缘中陆地单元格可以到达的所有点,做一个标记,然后看有多少陆地单元格没有被标记。这时候就可以考虑使用 b f s bfs bfs来解决此类问题。将所有的边缘位置上的陆地单元格加入队列中,然后每次取出队首元素进行标记,然后再访问该点四周的陆地单元格,然后加入队列,直到队列为空才停止。最后查看有多少陆地单元格没有被标记,这些点就是无法在任意次数的移动中离开网格边界。

代码

class Solution {
public:
    int dx[4]={0,0,1,-1};
    int dy[4]={1,-1,0,0};
    bool vis[500+50][500+50];
    int numEnclaves(vector<vector<int>>& grid) {
        int n=grid.size(),m=grid[0].size();
        queue<pair<int,int>>q;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if((i==0||j==0||i==n-1||j==m-1)&&grid[i][j]){
                    q.push({i,j});
                }
            }
        }
        while(!q.empty()){
            pair<int,int>now=q.front();q.pop();
            int x=now.first,y=now.second;
            if(vis[x][y])continue;
            vis[x][y]=1;
            for(int i=0;i<4;i++){
                int nex=x+dx[i],ney=y+dy[i];
                if(nex>=0&&nex<=n-1&&ney>=0&&ney<=m-1&&grid[nex][ney]){
                    q.push({nex,ney});
                }
            }
        }
        int ans=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(grid[i][j]&&!vis[i][j]){
                    ans++;
                }
            }
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Phoenix_ZengHao

创作不易,能否打赏一瓶饮料?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值