题目
1020.飞地的数量
题目大意
给你一个大小为 m x n
的二进制矩阵 grid
,其中 0
表示一个海洋单元格、1
表示一个陆地单元格。
一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid
的边界。
返回网格中 无法 在任意次数的移动中离开网格边界的陆地单元格的数量。
样例
数据规模
思路
题目的意思就是求有多少个陆地单元格无法到达四周边缘。那其实可以考虑四周边缘中陆地单元格可以到达的所有点,做一个标记,然后看有多少陆地单元格没有被标记。这时候就可以考虑使用 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;
}
};