LeetCode 5257. 统计封闭岛屿的数目
题目
有一个二维矩阵 grid ,每个位置要么是陆地(记号为 0 )要么是水域(记号为 1 )。
我们从一块陆地出发,每次可以往上下左右 4 个方向相邻区域走,能走到的所有陆地区域,我们将其称为一座「岛屿」。
如果一座岛屿 完全 由水域包围,即陆地边缘上下左右所有相邻区域都是水域,那么我们将其称为 「封闭岛屿」。
请返回封闭岛屿的数目。
示例 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
解释:
灰色区域的岛屿是封闭岛屿,因为这座岛屿完全被水域包围(即被 1 区域包围)。
示例 2:
输入:grid = [[0,0,1,0,0],[0,1,0,1,0],[0,1,1,1,0]]
输出:1
示例 3:
输入:grid = [[1,1,1,1,1,1,1],
[1,0,0,0,0,0,1],
[1,0,1,1,1,0,1],
[1,0,1,0,1,0,1],
[1,0,1,1,1,0,1],
[1,0,0,0,0,0,1],
[1,1,1,1,1,1,1]]
输出:2
分析
广度优先或者深度优先,在主函数里,如果碰到值为0的块,则这是一块新陆地,搜索这块陆地将他每一块的值改变。如果触及到边缘则将flag的值设置为0,如果没有flag的值则为1,当遍历完这块岛,将flag的值加到计数变量上即可。
C++代码
class Solution {
public:
int closedIsland(vector<vector<int>>& grid) {
int res = 0;
for(int i = 0; i < grid.size(); i++){
for(int j = 0; j < grid[0].size(); j++){
if(grid[i][j] == 0){
int end = 1;
dfs(grid, i, j, end);
res+=end;
}
}
}
return res;
}
int dfs(vector<vector<int>>& grid, int row, int col, int& end){
grid[row][col] = 2;
if(row - 1 >= 0){
if(grid[row - 1][col] == 0){
dfs(grid, row - 1, col, end);
}
}else{
end = 0;
}
if(row + 1 < grid.size()){
if(grid[row + 1][col] == 0){
dfs(grid, row + 1, col, end);
}
}else{
end = 0;
}
if(col - 1 >= 0){
if(grid[row][col - 1] == 0){
dfs(grid, row, col - 1, end);
}
}else{
end = 0;
}
if(col + 1 < grid[0].size()){
if(grid[row][col + 1] == 0){
dfs(grid, row, col + 1, end);
}
}else{
end = 0;
}
return 1;
}
};