leetcode - 统计封闭岛屿的数目
有一个二维矩阵 gridgridgrid ,每个位置要么是陆地(记号为 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;}
};
leetcode - 统计封闭岛屿的数目相关推荐
- LeetCode 1254. 统计封闭岛屿的数目(图的BFS DFS)
文章目录 1. 题目 2. 解题 2.1 DFS 2.2 BFS 1. 题目 有一个二维矩阵 grid ,每个位置要么是陆地(记号为 0 )要么是水域(记号为 1 ). 我们从一块陆地出发,每次可以往 ...
- 【LeetCode - 1254】统计封闭岛屿的数目(dfs,连通块)
题目链接:https://leetcode-cn.com/problems/number-of-closed-islands/ 有一个二维矩阵 grid ,每个位置要么是陆地(记号为 0 )要么是水域 ...
- C++算法学习(力扣:1254. 统计封闭岛屿的数目)
有一个二维矩阵 grid ,每个位置要么是陆地(记号为 0 )要么是水域(记号为 1 ). 我们从一块陆地出发,每次可以往上下左右 4 个方向相邻区域走,能走到的所有陆地区域,我们将其称为一座「岛屿」 ...
- leetcode1254. 统计封闭岛屿的数目(dfs)
有一个二维矩阵 grid ,每个位置要么是陆地(记号为 0 )要么是水域(记号为 1 ). 我们从一块陆地出发,每次可以往上下左右 4 个方向相邻区域走,能走到的所有陆地区域,我们将其称为一座「岛屿」 ...
- 【LeetCode】岛屿(周长、数量、最大面积、封闭岛屿数)
文章目录 岛屿的周长★ 岛屿数量★★ 岛屿数量Ⅱ★★★ 岛屿的最大面积★★ 统计封闭岛屿的数目★★ 岛屿的周长★ LeetCode463. 岛屿的周长 [题目]给定一个 row x col 的二维网格 ...
- LeetCode 1905. 统计子岛屿
LeetCode 1905. 统计子岛屿 题目 思路 代码 题目 链接: https://leetcode.cn/problems/count-sub-islands/ 给你两个 m x n 的二进制 ...
- LeetCode 1905. 统计子岛屿(BFS)
文章目录 1. 题目 2. 解题 1. 题目 给你两个 m x n 的二进制矩阵 grid1 和 grid2 ,它们只包含 0 (表示水域)和 1 (表示陆地). 一个 岛屿 是由 四个方向 (水平或 ...
- 【深度优先搜索】leetcode 1905. 统计子岛屿
1905. 统计子岛屿 文章目录 题目描述 示例1: 示例2: 提示 方法:深度优先搜索 解题思路 代码 复杂度分析 题目描述 给你两个 m x n 的二进制矩阵 grid1 和 grid2 ,它们只 ...
- LeetCode每日一题——1684. 统计一致字符串的数目
LeetCode每日一题系列 题目:1684. 统计一致字符串的数目 难度:简单 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 给你一个由不同字符组成的字符串 allowed ...
最新文章
- uiswitchbutton 点击不改变状态_Redux 包教包会(一):解救 React 状态危机
- Redis实现广告缓存、并完善缓存击穿
- 数据结构:复杂度分析以及数据结构整体概览
- 基于FPGA的AFDX接口实现
- 基于小波和插值的超分辨率图像重建算法
- 类与接口(四)方法重载解析
- Vue多字段下的非空判断(new Promise)
- Kafka : 查看kafka topic的消息offset范围
- 纵览轻量化卷积神经网络:SqueezeNet、MobileNet、ShuffleNet、Xception
- MongoDB高级查询详细
- android 当手柄打游戏,玩手游需不需要配手柄?谈移动游戏外设的三个机会
- 【ISO】Windows10系统ISO镜像怎么从微软官网下载?
- springdata jpa in查询
- php base64 转 amr,base64转amr文件
- 阿里P8亲自教你!Android高级工程师进阶学习,全套教学资料
- Mysql数据库存储ip地址
- 2021高考成绩查询微信预约推送,2021高考微信推送文案内容
- 尼康d850相机参数测试软件,尼康(Nikon)D850 单机数码相机宽容度评测-ZOL中关村在线...
- 程序人生:为什么现在的年轻人看不到希望?
- layui批量获取复选框的值