统计子岛屿
题目描述:
给你两个m x n的二进制矩阵grid1和grid2,它们只包含0(表示水域)和1(表示陆地)。一个岛屿是由四个方向(水平或者竖直)上相邻的1组成的区域。任何矩阵以外的区域都视为水域。
如果grid2的一个岛屿,被grid1的一个岛屿完全包含,也就是说grid2中该岛屿的每一个格子都被grid1中同一个岛屿完全包含,那么我们称grid2中的这个岛屿为子岛屿。
请你返回grid2中子岛屿的数目。


题解
用dfs扫描整个矩阵图,将一个点相连的所有陆地都置为海洋,即可用于统计子岛屿数量。
class Solution {
public:
int dx[5]={0, 0,1,-1};
int dy[5]={1,-1,0, 0};
void dfs(vector<vector<int>>& grid,int x,int y){
if(x<0||y<0||x>=grid.size()||y>=grid[0].size()||!grid[x][y]) return;
grid[x][y]=0;
for(int i=0;i<4;i++) dfs(grid,x+dx[i],y+dy[i]);
}
int countSubIslands(vector<vector<int>>& grid1, vector<vector<int>>& grid2) {
int m=grid1.size(),n=grid1[0].size();
for(int i=0;i<m;i++)
for(int j=0;j<n;j++){
if(grid1[i][j]==0&&grid2[i][j]==1)
dfs(grid2,i,j);//将没有完全包含的岛屿去掉
}
int ans=0;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++){
if(grid2[i][j]==1) {
ans++; //统计剩余的子岛屿数目
dfs(grid2,i,j);
}
}
return ans;
}
};

浙公网安备 33010602011771号