【BFS/DFS 解决 FloodFill 算法】岛屿数量

发布时间:2026/8/26 19:26:43

【BFS/DFS 解决 FloodFill 算法】岛屿数量
文章目录题目解析方向向量BFS广度优先搜索算法原理标记数组全局变量层序遍历代码实现DFS深度优先搜索算法原理全局变量dfs 函数函数头函数体代码实现题目链接200. 岛屿数量题目解析首先介绍一下什么是FloodFill算法FloodFill算法也称为洪水填充算法指的是在区域中找到性质相同的联通块注意这里的联通块指的是上下左右相邻斜线不能算做相邻。该算法可以使用深度优先搜索和广度优先搜索来解决。回到题目题目给我们一个由1陆地和0水组成的的二维字符网格grid我们需要计算网格中岛屿的数量。岛屿总是被水包围并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。示例1题目给出的二维网格grid是11110110101100000000那么岛屿只有一块11110110101100000000示例2题目给出的二维网格 grid11000110000010000011则有三块岛屿11000110000010000011方向向量在继续之前有必要知道我们在解决矩阵搜索类问题时访问某位置上下左右四个方向的操作。坐标〖i, j〗的上下左右四个坐标是在i和j加上了 0、1、-1 上下坐标〖i (-1), j 0〗和〖i 1, j 0〗左右坐标〖i 0, j (-1)〗和〖i 0, j 1〗。因此需要定义两个向量坐标dx {0, 0, -1, 1}dy {-1, 1, 0, 0}。在需要访问时通过 〖row, col〗坐标和四次循环依次访问即可。BFS广度优先搜索算法原理题目的本质是在二维矩阵中搜索因此我们可以遍历整个矩阵当找到一个未被标记的岛屿就更新岛屿数量记录并标记为已访问然后根据该岛屿的位置坐标通过层序遍历依次找到与其相连的所有未被标记过的陆地并标记为已访问当矩阵遍历完毕后返回统计到的岛屿数量标记数组我们在进行 BFS 的时候可能会重复进入某个方格。可以用两种方式避免重复访问在原数组上修改使用标记数组对于第一种方式在面试时需要确定能否在原数组上修改而第二种方式则更安全我们使用一个布尔类型的二维数组visit设置其大小与题目所给矩阵大小一样通过坐标能够对应矩阵中某个方格从而标记方格的访问状态。全局变量我们需要用到矩阵的行数和列数因此将m和n作为全局变量布尔类型的标记数组visit用于标记矩阵中某个方格是否已被访问方向数组dx和dy辅助我们从某个位置向其上下左右四个方向访问。intm,n;boolean[][]visit;int[]dx{0,0,-1,1};int[]dy{-1,1,0,0};层序遍历我们使用一个队列实现层序遍历的操作队列存储与〖row, col〗位置相连的陆地的坐标当队列不为空时一直取出队首元素获取坐标然后根据坐标向该元素的上下左右四个方向访问查找符合条件的陆地与该位置相连且未被访问过找到符合条件的陆地之后入队然后更新标记为已访问防止被重复访问当队列为空层序遍历完毕由于我们每次遍历矩阵找到一个未被标记过的岛屿时都要进行依次层序遍历操作因此将该操作封装为一个方法。代码实现classSolution{intm,n;// 矩阵grid的行数和列数boolean[][]visit;// 用于标记是否已访问// 辅助访问某一位置上下左右方向的数组int[]dx{0,0,-1,1};int[]dy{-1,1,0,0};publicintnumIslands(char[][]grid){intret0;// 用于统计岛屿的数量// 初始化mgrid.length;ngrid[0].length;visitnewboolean[m][n];// 遍历矩阵for(inti0;im;i){for(intj0;jn;j){if(grid[i][j]1!visit[i][j]){// 找到一块未被标记的岛屿ret;// 更新岛屿数量visit[i][j]true;// 将[i,j]位置做已访问标记bfs(grid,i,j);// 将与该岛屿相连的所有陆地通过BFS标记}}}// 返回统计的岛屿数量returnret;}publicvoidbfs(char[][]grid,introw,intcol){// 使用队列存储与[row,col]位置相连的坐标Queueint[]queuenewArrayDeque();queue.offer(newint[]{row,col});// 层序遍历while(!queue.isEmpty()){int[]topqueue.poll();// 取出队首元素rowtop[0];coltop[1];// 获取队首元素的坐标// 从队首元素向上下左右四个方向访问未被标记的陆地for(intk0;k4;k){intxrowdx[k],ycoldy[k];if(x0xmy0yn){if(grid[x][y]1!visit[x][y]){queue.offer(newint[]{x,y});// 符合条件,入队visit[x][y]true;// 标记该陆地为已访问}}}}}}DFS深度优先搜索算法原理遍历矩阵当找到一个未被标记过的岛屿时就更新岛屿的数量并标记然后从这个位置开始向四周深度优先搜索相邻的未被标记过的陆地直到搜索不到陆地为止。当矩阵遍历完毕返回所记录的岛屿的数量即可全局变量为了 dfs 函数递归方便将矩阵grid改成全局变量m和n记录矩阵的大小ret用于记录岛屿的数量。布尔类型的数组visit则用于标记已经发现的岛屿和陆地防止重复计入dx和dy方向数组用于访问指定位置的上下左右四个方向。char[][]grid;intm,n,ret;boolean[][]visit;int[]dx{0,0,-1,1};int[]dy{-1,1,0,0};dfs 函数函数头dfs 函数的任务是从指定位置出发访问它的四个方向因此函数的参数是row和col表示某位置的坐标。dfs(introw,intcol);函数体我们在 dfs 函数体中要做的事情就是从指定位置坐标[ row, col ]出发逐一访问该位置的上、下、左、右四个方向的位置看看是否是未记录过的陆地如果是就继续递归深搜否则不进行深搜。具体就是循环四次然后计算出下一个位置的坐标判断坐标是否合法若合法就进一步判断该坐标在 grid 矩阵中的值是否是 ‘1’ —— 该位置是陆地该坐标的在 visit 中的值是否不等于 “true” —— 该位置未被标记过若以上两个条件都满足就继续递归深搜。代码实现classSolution{char[][]grid;intm,n,ret;boolean[][]visit;int[]dx{0,0,-1,1};int[]dy{-1,1,0,0};publicintnumIslands(char[][]givenGrid){gridgivenGrid;mgrid.length;ngrid[0].length;visitnewboolean[m][n];for(inti0;im;i){for(intj0;jn;j){if(grid[i][j]1!visit[i][j]){// 找到未被标记过的岛屿标记该岛屿并更新岛屿数量visit[i][j]true;ret;dfs(i,j);// 从该位置开始向四周寻找相邻的陆地}}}returnret;}privatevoiddfs(introw,intcol){for(intk0;k4;k){intxrowdx[k],ycoldy[k];if(x0xmy0yn){if(grid[x][y]1!visit[x][y]){// 找到未被标记过的相邻陆地visit[x][y]true;dfs(x,y);}}}}}文章到这里就告一段落了若有错误请尽管指出完

相关新闻

前端现在只会玩框架,原生JS全忘光了,行业集体退化到令人发指

前端现在只会玩框架,原生JS全忘光了,行业集体退化到令人发指

2026/8/26 19:26:43

当下的前端圈子已然糟糕到了极点, 每个人都在追逐框架, 比拼语法, 炫耀工程化, 然而却连最为基础的原生 JS 都没办法写明白。整个行业都呈现出集体退化, 集体摆烂的态势。Vue、React、TS、Vite 一股脑儿叠加起来, 人人都感觉自己是高级工程师, 可是真要是叫他们脱离框架去写些内…

Kimi    LeetCode LCP 35. 电动车游城市 Python3实现

Kimi LeetCode LCP 35. 电动车游城市 Python3实现

2026/8/26 19:16:42

以下是 LCP 35. 电动车游城市 的 Python3 实现,采用 分层图最短路 Dijkstra 算法。---解题思路这是一道经典的分层图最短路问题。核心思想是将状态定义为 (城市, 电量) 二元组,然后在这个扩展的状态空间上运行 Dijkstra 算法 。状态空间: - …

有限 GBP 对滤波器的影响

有限 GBP 对滤波器的影响

2026/8/26 19:16:42

在对有源滤波器的研究中,我们假设运算放大器是理想的,这样我们就可以不用考虑运算放大器的特性,而是只研究滤波器的响应。理想情况(简化模型):​ 在最基础的分析中,通常假设运算放大器是“理想”…

舞台直拍视频自动化处理:从FFmpeg转码到多平台分发全链路解析

舞台直拍视频自动化处理:从FFmpeg转码到多平台分发全链路解析

2026/8/26 20:36:45

舞台直拍视频背后,是从现场收音到云端分发的完整技术链路 你可能在短视频平台刷到过这样的视频:LIVEHOUSE 舞台上,歌手在聚光灯下唱完整首歌,画面全程稳稳对准一个人,声音干净,镜头不抖,弹幕里刷…

DPJ-82基于STM32单片机蓝牙智能语音识别分类垃圾桶设计 火灾预防桶满报警自动照明垃圾桶系统

DPJ-82基于STM32单片机蓝牙智能语音识别分类垃圾桶设计 火灾预防桶满报警自动照明垃圾桶系统

2026/8/26 20:36:45

1、前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉洪核学长自己做的项目系统达不到老师的要求。为了大家能够顺利以及最少的精力通过毕设&#xf…

聚苯乙烯微球制备方法详解:从乳液聚合到分散聚合的工程实践

聚苯乙烯微球制备方法详解:从乳液聚合到分散聚合的工程实践

2026/8/26 20:36:45

1. 从“塑料泡沫”到精密微球:为什么PS微球制备值得深究? 提到聚苯乙烯,很多人第一反应是那种白色、轻飘飘的泡沫塑料,也就是我们常说的“泡沫箱”或“泡沫板”。这确实是聚苯乙烯(PS)最广为人知的一种形态…

基于Matlab的配电网鲁棒动态重构:模型、算法与工程实现

基于Matlab的配电网鲁棒动态重构:模型、算法与工程实现

2026/8/26 20:36:45

1. 项目概述与核心价值最近在复现一篇关于配电网鲁棒动态重构的EI期刊论文,这个方向在分布式电源大规模接入的背景下,热度一直不减。很多同学在做毕设或者研究时,都会遇到类似的问题:模型建好了,算法也写了&#xff0c…

NGINX编译安装全攻略:从源码到生产环境的实战指南

NGINX编译安装全攻略:从源码到生产环境的实战指南

2026/8/26 20:36:45

1. 从“下载”到“跑起来”:一个完整的NGINX安装视角 每次看到“NGINX安装手册”这个标题,很多人的第一反应可能就是去官网下载一个tar.gz包,然后执行那经典的 ./configure && make && make install 三步曲。但如果你真的这…

Greenplum 日常维护命令

Greenplum 日常维护命令

2026/8/26 20:26:45

Greenplum 日常维护 1. 数据库启动:gpstart 常用可选参数: -a : 直接启动,不提示终端用户输入确认 -m:只启动master 实例,主要在故障处理时使用 2. 数据库停止:gpstop: 常用可选参数&#…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/26 1:50:39

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/26 1:49:16

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/26 17:50:58

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

2026/8/26 0:05:45

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

Hermes接入团队协作后,我推翻了三个效率假设

Hermes接入团队协作后,我推翻了三个效率假设

2026/8/26 0:05:45

聊《Hermes真能提效吗?先看流程里最慢的那一步》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要团队把 Hermes 接进项目三个月后,交付速度没有提升反而慢了。复盘后发现,最先…

免费AI大模型调教指南:打造专属网文写作助手

免费AI大模型调教指南:打造专属网文写作助手

2026/8/26 0:05:45

1. 先搞清楚“AI小说扩展模式”到底能帮你做什么如果你是一个刚开始写网文、或者卡在L3级别以下的作者,最头疼的可能是情节推进不下去、人物对话干瘪,或者世界观设定不够丰满。自己对着空白文档硬憋,效率很低。这时候,一个能理解你…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/26 18:07:30

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/26 17:57:52

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…