1020.飞地的数量

题目

1020.飞地的数量

题目大意

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

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

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

样例

1020.飞地的数量_第1张图片

数据规模

1020.飞地的数量_第2张图片

思路

题目的意思就是求有多少个陆地单元格无法到达四周边缘。那其实可以考虑四周边缘中陆地单元格可以到达的所有点,做一个标记,然后看有多少陆地单元格没有被标记。这时候就可以考虑使用 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;
    }
};

你可能感兴趣的:(#,leetcode每日一题,leetcode,bfs)