统计子岛屿

Leetcode 1905.统计子岛屿

题目描述:

给你两个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;
    }
};
posted @ 2021-11-15 13:40  Chilyyy  阅读(54)  评论(0)    收藏  举报