有一个二维矩阵 g r i d grid 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],
\space \space \space \space \space \space \space \space \space \space \space [1,0,0,0,0,0,1],
\space \space \space \space \space \space \space \space \space \space \space [1,0,1,1,1,0,1],
\space \space \space \space \space \space \space \space \space \space \space [1,0,1,0,1,0,1],
\space \space \space \space \space \space \space \space \space \space \space [1,0,1,1,1,0,1],
\space \space \space \space \space \space \space \space \space \space \space [1,0,0,0,0,0,1],
\space \space \space \space \space \space \space \space \space \space \space [1,1,1,1,1,1,1]]
输出:2
提示:
- 1 <= grid.length, grid[0].length <= 100
- 0 <= grid[i][j] <=1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-closed-islands
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
————————
解题思路:采用深度优先遍历,对于每一个陆地,设定一个标记label,通过遍历染色,将所有相邻的陆地标记为相同的label,如果遍历到边界位置,则该岛屿不是封闭岛屿。
class Solution {
public:
int h = 0; # 用于存储矩阵的行数
int l = 0; # 用于存储矩阵的列数
int hh[4] = {-1,0,1,0}; # 建立一个数组,用于行进行上下左右的位移
int ll[4] = {0,1,0,-1}; # 建立一个数组,用于列上下左右的位移
void dfs(vector<vector<int>>& g,int i,int j,int& flag) # 深度遍历函数
{
g[i][j] = -1; # 将陆地的颜色(label)标记为-1
for(int k=0;k<4;k++) # 遍历该陆地的上下左右四个位置的情况
{
int hx = i + hh[k]; # 使用上面定义的数组的四个值进行行位移操作
int ly = j + ll[k]; # 使用上面定义的数组的四个值进行列位移操作
if(hx>=0 && hx<h && ly>=0 &&ly<l && !g[hx][ly]) # 看位移之后的位置是否在矩阵中
{
if(hx==0||hx==h-1||ly==0||ly==l-1) # 判断陆地位置是否在边界位置
flag=0; # 如果陆地在边界位置,则不可能是封闭岛屿
dfs(g,hx,ly,flag); #对现在岛屿位置的点做深度遍历
}
}
}
int closedIsland(vector<vector<int>>& g)
{
int sum = 0; # 用于存储封闭岛屿的数量
h = g.size(); # 计算矩阵的行数
l = g[0].size(); # 计算矩阵的列数
for(int i=1;i<h-1;++i) # 遍历矩阵中的每个点,判断是否是陆地,因为边界上的陆地不可能是封闭岛屿,所以跳过最外圈
{
for(int j=1;j<l-1;++j)
{
if(!g[i][j]) # 如果是岛屿,则进行深度遍历
{
int flag = 1; # 作为该陆地块是否是封闭岛屿的判断条件
dfs(g,i,j,flag); # 对该点进行深度遍历
sum += flag; 计算以该点为起始点的陆地块是否是封闭岛屿进行相加
}
}
}
return sum;
}
};