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;
}