当前位置: 首页 > article >正文

DFS连通域统计:岛屿数量问题及其变形

0.前言本文我们来学习一下算法题中颇为著名的岛屿数量问题我将会从问题本身入手详细分析解题思路给出完整代码并进行解析最后简单了解一下几个岛屿问题的变种题目。1. 问题描述题目给出一个只含有 0 和 1 矩阵1 代表是陆地0 代表海洋 如果两个 1 相邻那么这两个 1 属于同一个岛我们暂时只考虑上下左右为相邻。上下左右相邻的陆地可以组成一个岛屿我们的目标是计算岛屿的个数。当输入为下图的矩阵时共有三个岛屿因此输出应该为 3 。2. 解题思路当题目给出一个M × N的矩阵时我们需要找出岛屿个数可以考虑如下思路从矩阵的第一行第一个元素开始遍历直到遍历完整个矩阵。当遍历到0时直接跳过。每当遍历到一个1时说明找到了一个岛屿将岛屿数量加 1然后将这个1修改为0。此外还需要使用 DFS 从该位置开始向上下左右四个方向分别遍历一样是遇到0就跳过遇到1就改成0这时不需要在将岛屿数量加一了因为我们现在处理的是第一次发现的那个子岛屿的相邻岛屿他们整体只算一个岛屿这样能够保证不会重复计数。3. 完整代码classSolution{public:voiddfs(vectorvectorchargrid,intr,intc){intnrgrid.size();intncgrid[0].size();//如果越界或者遇到0就直接返回if(r0||rnr||c0||cnc||grid[r][c]0){return;}//能走到这说明遇到1了把它改成0grid[r][c]0;//向上下左右四个方向继续找找到了继续改dfs(grid,r,c-1);dfs(grid,r,c1);dfs(grid,r-1,c);dfs(grid,r1,c);}intsolve(vectorvectorchargrid){intnrgrid.size();if(nr0)return0;intncgrid[0].size();intisland_num0;for(intr0;rnr;r){for(intc0;cnc;c){if(grid[r][c]1){//只需要在主循环中第一次遇见1时将岛屿数量加一//dfs会把这个1上下左右连通的1全部改成0,防止重复计数island_num;dfs(grid,r,c);}}}returnisland_num;}};4. 代码执行流程详解为了能够更加深入地了解代码的执行过程我以下面的矩阵为例详细分析一下程序开始时会先执行solve函数。solve函数中有一个嵌套的for循环通过这个双层for循环我们可以遍历整个矩阵中的所有元素。嵌套for循环从第一行第一个元素也就是0,0开始发现这个位置是1于是island_num变成了1然后就会调用dfs(grid,0,0)此时solve函数被挂起等待dfs执行结束。进入dfs(grid, 0, 0)之后检查发现没有越界并且位置(0,0)的值为1接着将这个1改成0。再然后向四个方向继续蔓延处理掉所有连通的1。先来看dfs(0, 0)的向右分支也就是dfs(0, 1)发现值为1于是把它改成0然后继续蔓延。向左(0,0)发现是0刚才改的。向右(0,2)这里本来就是0。向上(-1, 1)越界直接返回。向下(1,1)本来就是0返回。dfs(0, 1)执行完成返回上一层。然后执行dfs(0, 0)的向下分支也就是dfs(1, 0)值为1改成0。它也会向四个方向蔓延但是由于它周围要不原本就是0要不就是被我们处理成了0因此它向四个方向的dfs都会直接返回。然后dfs(1, 0)执行完毕返回上一层。dfs(0, 0)的其他分支向上和向左都会越界直接return此时左上角的连通块(0,0), (0,1), (1,0)已经全都变成了0。然后dfs(0, 0)运行彻底结束程序接着刚才挂起的solve函数继续执行。接着进行for循环第一行第二个元素这个位置原本是1但是已经被我们改成0了于是直接跳过。中间所有的元素已经全为0全部跳过直到第三行第三个元素。发现是1island_num变成 2然后调用dfs(grid, 2, 2)重复上面的蔓延过程最终这个位置也变成了0。5. 代码优化假设修改一下代码对角线相连的 1 也算同一个岛屿即 8 个方向都能扩散。请思考一下怎么改代码其实很简单只用再加上四行对角线遍历的代码就行让从当前位置可以向左上左下右上右下蔓延。voiddfs(vectorvectorchargrid,intr,intc){intnrgrid.size();intncgrid[0].size();if(r0||rnr||c0||cnc||grid[r][c]0){return;}grid[r][c]0;dfs(grid,r,c-1);dfs(grid,r,c1);dfs(grid,r-1,c);dfs(grid,r1,c);//只需要添加下面四行即可dfs(grid,r-1,c-1);dfs(grid,r-1,c1);dfs(grid,r1,c-1);dfs(grid,r1,c1);}但是这段代码有 8 行dfs看起来有点难看于是我们还可以进行如下修改//8个方向的偏移量上下左右和4个对角线intdr[]{-1,1,0,0,-1,-1,1,1};intdc[]{0,0,-1,1,-1,1,-1,1};voiddfs(vectorvectorchargrid,intr,intc){//...越界检查...grid[r][c]0;//一个循环搞定所有方向for(inti0;i8;i){dfs(grid,rdr[i],cdc[i]);}}6. 岛屿问题变形这道题目可能还会出一些变形对于这些变形题只需要在上面代码中进行微调即可。6.1 求最大岛屿面积题目要求不再是数有多少个岛而是找出面积最大也就是包含 1 最多的那个岛。代码微调dfs函数不再返回void而是返回一个int代表这次处理掉了多少个 1。让dfs返回return 1 dfs(上) dfs(下) dfs(左) dfs(右)。solve函数中添加max_area max(max_area, dfs(r, c))。6.2 求岛屿周长题目要求计算岛屿边缘的长度。代码微调dfs 终止条件当你试图往海里走也就是grid 0或者越界时说明你撞到了边界。每撞到一次边界就return 1。最后把撞到的次数加起来6.3 封闭岛屿题目要求如果一个岛屿靠着地图边缘它就不算只数那些被海水完全包围的。代码微调写一个循环把地图四周边缘上的 1 全都作为起点跑一遍 dfs变成0。将得到的矩阵再用现在那套代码数剩下的岛屿。本文完。

相关文章:

DFS连通域统计:岛屿数量问题及其变形

0.前言 本文我们来学习一下算法题中颇为著名的岛屿数量问题,我将会从问题本身入手,详细分析解题思路,给出完整代码并进行解析,最后简单了解一下几个岛屿问题的变种题目。 1. 问题描述 题目给出一个只含有 0 和 1 矩阵,…...

Coze 智能体开发标准流程

在 Coze(扣子)平台上开发 AI 智能体(Agent)的流程可以概括为 “创建 - 编排 - 调试 - 发布” 四个核心阶段。无论你是使用国内版 (coze.cn) 还是国际版 (coze.com),其逻辑架构基本一致。1. 创建智能体 (Create)这是项目…...

微服务下的跨域问题

在单体架构时代,跨域问题还不算突出;但进入微服务、前后端分离、多端统一时代,跨域几乎是每个项目必踩的坑。尤其在微服务架构下,网关、认证、分布式部署、多域名并存,让跨域变得更复杂、更隐蔽。本文从浏览器同源策略…...

别再只会写 cron:Crontab MCP Tool 实战与 DMXAPI

如果让我给“适合和大模型结合、但又最容易被低估的基础设施”排个名,Crontab MCP Tool 一定在前列。很多人第一次听到这个名字,会本能地把它理解成“给 cron 包一层壳”,甚至觉得不过是把旧时代的定时任务概念搬到 MCP 生态里重新命名。但我…...

【区间概率预测】PSO-LightGBM-ABKDE多变量时序预测 基于粒子群算法优化轻量级梯度提升机结合自适应带宽核函数密度估计的多变量时序预测

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。👇 关注我领取海量matlab电子书和数学建模资料🍊个人信条:格物致知,完整Matl…...

基于LabVIEW的纯软件信号发生器功能介绍

基于labview的信号发生器 功能介绍:纯软件方面的信号发生器,没有引入NI外部模块,生成的信号只在示波器中显示。 包括高斯白噪声、正弦波、方波、锯齿波、三角波、均匀白噪声、自定义公式,通过枚举按钮选择生成信号类型&#xff0c…...

WindowsCleaner系统优化实战指南:从C盘告急到性能重生

WindowsCleaner系统优化实战指南:从C盘告急到性能重生 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 适用人群自测 请根据你的电脑使用情况选择符合…...

Aitoon arnold渲染器 卡通材质

Edge边,silhouette剪影只有两个跟普通材质不同,其他都跟普通材质一样Stylized highlight风格化高光;specular高光;rim lighting轮廓光transmission透射sheen光泽emission自发光【实例 卡通材质渲染边】打开edge requires contour …...

告别量子调试:手把手教你正确使用QtConcurrent::run和QThreadPool执行类方法

告别量子调试:手把手教你正确使用QtConcurrent::run和QThreadPool执行类方法 在Qt多线程开发中,最令人头疼的莫过于那些"薛定谔式"的Bug——它们在某些环境下稳定运行,换个场景就神秘崩溃。特别是当我们需要将传统单线程业务类改造…...

从Revit/BIM到Cesium:CesiumLab 4.0.7插件全流程打通,属性信息一个不丢

从Revit到Cesium的无损数据迁移:CesiumLab 4.0.7全流程深度解析 1. BIM与三维GIS融合的技术演进 在建筑信息模型(BIM)与地理信息系统(GIS)的交叉领域,数据互操作性一直是行业痛点。传统工作流中&#xff0c…...

效率神器:用快马AI将antigravity彩蛋变为你的趣味开发效率工具

今天想和大家分享一个提升开发效率的小技巧——把Python里经典的antigravity彩蛋变成日常开发的趣味工具。这个想法源于我发现很多开发者(包括我自己)在紧张的工作中容易陷入枯燥的重复劳动,而一些小小的趣味互动其实能有效缓解疲劳&#xff…...

3分钟搞定!B站视频下载神器让你轻松保存大会员4K高清视频 [特殊字符]

3分钟搞定!B站视频下载神器让你轻松保存大会员4K高清视频 🚀 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 还…...

手把手教你用Python实现TOTP动态验证码生成器(附完整代码)

用Python构建TOTP动态验证码生成器的实战指南 1. 为什么需要TOTP动态验证码? 在数字身份安全领域,传统的用户名密码组合已经无法满足现代安全需求。根据Verizon《2023年数据泄露调查报告》,超过80%的黑客攻击利用了弱密码或被盗凭证。这就是为…...

2026降AI工具终极实测:笔灵AI遥遥领先,免费与付费的真实差距

最近收到大量关于求推荐降AI工具的咨询。随着Turnitin、知网、GPTZero等检测平台更新,AI生成的文字很容易被识别。 为了找到有效的工具,我耗时半个月,测试了10款主流工具。本文将基于降AI效果、可读性、成本三个维度,为你提供一份…...

BilibiliDown:让B站无损音频下载更高效的跨平台工具

BilibiliDown:让B站无损音频下载更高效的跨平台工具 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/…...

手把手教你用RK3588的NPU跑通第一个YOLOv5模型(附环境配置避坑点)

从零部署YOLOv5到RK3588 NPU:完整环境配置与模型转换实战 拿到RK3588开发板的第一时间,许多开发者最迫不及待想验证的就是其NPU的AI推理性能。作为瑞芯微第四代RKNPU架构的旗舰芯片,RK3588的6TOPS算力在边缘计算领域确实令人期待。但在实际部…...

如何将iCloud/iTunes备份恢复到新的iPhone?

刚买了一部新 iPhone,不知道如何恢复所有旧数据?无论您的备份存储在 iTunes 还是 iCloud,都有多种方法可以将备份恢复到新 iPhone。本指南将逐步指导您完成所有可靠的方法,以便您快速将旧设备上的所有内容传输到新设备并从上次中断…...

Visio是什么?附安装使用全流程

Visio是什么? 它是微软出品的专业图表绘制工具,是Office家族里最低调、但也是职场进阶最硬核的成员之一。如果说Excel是处理数字的神,那Visio就是处理逻辑和流程的王者。 安装教程和安装包获取 为什么建议你试试Visio? 1. 拖拽…...

基于QT(C++)+Oracle实现的(界面)教务管理系统

一、选题背景 教务管理系统是基本每个高校都有的一个系统,教务系统管理系统充分利用互联网络B/S管理系统模式,以网络为平台,为各个学校教务系统的管理提供一个平台,帮助学校管理教务,用一个账号解决学校教务教学管理&…...

Qwen3.5-2B模型在Web开发中的创新应用:智能内容生成与审核

Qwen3.5-2B模型在Web开发中的创新应用:智能内容生成与审核 1. 引言:当Web开发遇上AI内容生成 想象一下这样的场景:用户上传了几张旅行照片,系统自动生成了一篇图文并茂的游记草稿;或者社区平台能够实时审核用户上传的…...

新手福音!5分钟手把手教你用JSON→C# Entities解决实体类生成难题

大家好,我是CSDN的老用户daier。最近不少读者在后台问我:“后端接口返回一堆JSON数据,要在C#项目里写对应的Model类,太麻烦了!嵌套对象、数组、下划线转PascalCase、nullable类型怎么办?” 今天我手把手带…...

基于QT(C++)实现(界面)实现的五子棋游戏

Qt小游戏开发:五子棋(带AI功能) 写了一个带AI的五子棋小游戏,AI的表现还可以~ 1.预览 2.步骤 整体的代码结构,一个游戏逻辑类,一个UI类 2.1定义游戏数据结构 // 游戏类型,双人还是AI&#x…...

网络资源捕获神器:res-downloader全方位应用指南

网络资源捕获神器:res-downloader全方位应用指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 在数字内容日益丰…...

Java final关键字详解:用法、场景、面试题全解析

哈喽,各位Java学习者!今天咱们拆解一个Java中高频且核心的关键字——final。它看似简单,仅表示“最终的、不可修改的”,但在实际开发和面试中都高频出现,稍不注意就会踩坑。本文全程围绕final的核心用法展开&#xff0…...

告别对账熬夜,Captain AI帮你揪出Ozon的异常扣费

做Ozon的卖家,几乎都有过这样的经历:月底打开平台账单,密密麻麻全是俄语专业术语,看半天也看不懂每一笔钱扣在了哪里;熬一整个通宵核对账单,却还是算不清每一笔收支,找不到平台多扣的钱&#xf…...

AI图片清晰修复:给模糊的照片配一副“眼镜”

谁手里没存过几张模糊到让人无奈的照片?家里的老照片泛黄发糊,岁月的痕迹让亲人的眉眼变得模糊不清;随手拍下的风景、人像,稍微放大一点就满屏噪点,细节全被糊成一团;工作中存的资料图、会议截图&#xff0…...

数学周刊第14期(2026年03月30日-04月06日)中国数学家王虹再获殊荣

目录王虹获纽约大学最高荣誉,距菲尔兹奖仅一步之遥香港科大团队首创代码驱动系统参考资料王虹获纽约大学最高荣誉,距菲尔兹奖仅一步之遥 当地时间4月2日,美国纽约大学柯朗数学科学研究所宣布,中国数学家王虹获评该校“银教授”&am…...

避坑指南:Ubuntu20.04下用Python3.8搞定Carla 0.9.13预编译版与ROS Bridge(解决卡死问题)

Ubuntu 20.04下Python 3.8与Carla 0.9.13的完美联姻:ROS Bridge避坑全指南 当自动驾驶仿真遇上机器人操作系统,Carla与ROS的集成堪称绝配。但这对黄金搭档的联姻之路却布满荆棘——Python版本冲突、依赖库不兼容、环境变量混乱,每一个坑都可能…...

【单片机】51单片机的晶振选择

51单片机的晶振可以是12MHz,但更多的使用11.0592MHz。因为51单片机的串口的波特率在可调模式下,通过定时器溢出来确定时间。 定时器计数采用机器周期,51单片机指令集属于CISC,可能与此有关,导致12个晶振时钟周期等于1个…...

CVPR/ICCV跟踪新趋势解读:对比学习如何让MOT模型学会“认人”?

对比学习如何重塑多目标跟踪:从特征判别到轨迹记忆的技术革命 在拥挤的街头,人类能轻易识别并持续关注某个特定行人——这种看似简单的生物视觉能力,却让计算机视觉系统奋斗了数十年。多目标跟踪(MOT)技术正经历着从&q…...