leetcode1254. 统计封闭岛屿的数目

leetcode1254统计封闭岛屿的数目

二维矩阵 grid 由 0 (土地)和 1 (水)组成。岛是由最大的4个方向连通的 0 组成的群,封闭岛是一个 完全 由1包围(左、上、右、下)的岛。
请返回 封闭岛屿 的数目。
示例1

输入:grid = [[1,1,1,1,1,1,1,0],[1,0,0,0,0,1,1,0],[1,0,1,0,1,1,1,0],[1,0,0,0,0,1,0,1],[1,1,1,1,1,1,1,0]]
输出:2

思路: bfs: 遍历没有访问过的土地位置, 每次以没有访问过的土地位置为起点bfs, 并记录是否能到达矩阵的边界, 若不能则当前bfs访问的所有土地位置为一个封闭岛屿,并将访问过的土地染色成1。
注意一定要将完整访问整个岛屿&、&& 这两个符号是不一样的

return backing(grid,x+1,y) & backing(grid,x-1,y) & backing(grid,x,y+1) & backing(grid,x,y-1);

这里要么分开写,然后将所有结果进行 && 操作,或者用 & 操作,否则存在某些节点无法遍历的情况,岛屿重复统计

bool backing(vector<vector<int>>& grid,int x,int y){
        int m = grid.size(), n=grid[0].size();
        if(x>=m || x<0 || y>=n || y<0 ) return false;
        if(grid[x][y] == 1) return true;
        grid[x][y]=1;
        // 注意,这里要么分开写,然后将所有结果进行 && 操作,或者用 & 操作,否则存在某些节点无法遍历的情况,导致一些问题
        return backing(grid,x+1,y) & backing(grid,x-1,y) & backing(grid,x,y+1) & backing(grid,x,y-1);
    }
    int closedIsland(vector<vector<int>>& grid) {
        int m = grid.size(), n=grid[0].size(),sum=0;
        for(int i=0;i<m;++i){
            for(int j=0;j<n;++j){
            // 如果该节点存在
        	// 如果是水返回true比较好理解
        	// 如果是已经遍历过就返回true,这是因为经过上一层递归的前置判断可以判断该位置是没有问题的
                if(!grid[i][j]){
                    sum += backing(grid,i,j)?1:0;
                }
            }
        }
        return sum;
    }

你可能感兴趣的:(LeetCode刷题,leetcode,算法)