算法——BFS算法

news/2024/5/4 0:51:47

1. 什么是BFS算法

BFS(广度优先搜索,Breadth-First Search)算法是一种用于图和树等数据结构中进行搜索的基本算法。它从指定的起始节点开始,逐层地向外扩展搜索,直到找到目标节点或遍历完整个图。

BFS算法的基本思想是:先访问起始节点,然后依次访问起始节点的邻居节点,再依次访问邻居节点的邻居节点,以此类推,直到搜索到目标节点或者遍历完整个图。BFS算法使用队列来辅助实现节点的遍历顺序,保证每一层的节点按顺序访问。 

2. 应用实例

①BFS解决FloodFill问题

1. 图像渲染

题目链接:733. 图像渲染 - 力扣(LeetCode)

解析:题目的要求是对一大批性质相同的连续区域进行处理,我们可以使用BFS来进行处理,代码如下

class Solution 
{
public:int dx[4] = {1,-1,0,0};int dy[4] = {0,0,1,-1};int m,n;int check[51][51] = {0};vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {m = image.size(), n = image[0].size();queue<pair<int, int>> q;q.push({sr,sc});while (!q.empty()){int sz = q.size();while (sz--){auto pair = q.front();int a = pair.first, b = pair.second;int prevcolor = image[a][b];image[a][b] = color;q.pop();for (int i = 0; i < 4; i++){int x = a + dx[i], y = b + dy[i];if (x >= 0 && x < m && y >= 0 && y < n && image[x][y] == prevcolor && !check[x][y]){q.push({x, y});check[x][y] = 1;}}}}return image;}
};

2. 岛屿数量

题目链接:200. 岛屿数量 - 力扣(LeetCode)

解析:根据题目要求,我们在每次遇见‘1’时,从这个位置开始进行一次bfs将所有相邻为‘1’的区域置为‘0’,在每次进入后记录一次岛屿个数,遍历一遍之后就能得到答案,代码如下

class Solution 
{
public:int dx[4] = {0,0,1,-1};int dy[4] = {1,-1,0,0};int m,n;int check[301][301] = {0};void bfs(vector<vector<char>>& grid, int row, int col){queue<pair<int, int>> q;q.push({row, col});while (!q.empty()){int sz = q.size();while (sz--){auto [a, b] = q.front();q.pop();grid[a][b] = '0';for (int i = 0; i < 4; i++){int x = a + dx[i], y = b + dy[i];if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == '1' && !check[x][y]){q.push({x, y});check[x][y] = 1;} }}}}int numIslands(vector<vector<char>>& grid) {int count = 0;m = grid.size(), n = grid[0].size();for (int i = 0; i < m; i++)for (int j = 0; j < n; j++)if (grid[i][j] == '1') {bfs(grid, i, j);count++;}return count;}
};

3. 岛屿的最大面积

题目链接:695. 岛屿的最大面积 - 力扣(LeetCode)

解析:我们可以在遇见值为1的区域时,我们对其使用一次bfs统计该区域岛屿大小,边统计边将其置为0,最后与ret相比较,让ret更新为最大值并返回,代码如下

class Solution 
{
public:int m, n, ret;int dx[4] = {1,-1,0,0};int dy[4] = {0,0,1,-1};int check[51][51] = {0};void bfs(vector<vector<int>>& grid, int row, int col){int area = 0;queue<pair<int, int>> q;q.push({row, col});while (!q.empty()){int sz = q.size();while (sz--){auto [a, b] = q.front();area++;q.pop();grid[a][b] = 0;for (int i = 0; i < 4; i++){int x = a + dx[i], y = b + dy[i];if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1 && !check[x][y]){q.push({x, y});check[x][y] = 1;}}}}ret = max(ret, area);}int maxAreaOfIsland(vector<vector<int>>& grid) {ret = 0;m = grid.size(), n = grid[0].size();for (int i = 0; i < m; i++)for (int j = 0; j < n; j++)if (grid[i][j] == 1) bfs(grid, i, j);return ret;}
};

4. 被围绕的区域

题目链接:130. 被围绕的区域 - 力扣(LeetCode)

解析:分析题意,我们可以先遍历图形的四周,遇见'O'就进行一次bfs,将所有与边缘相连的'O'均设置为'A'(随意),然后遍历整个图形,将为‘O’的改为‘X’,为‘A’的改为‘O’即可,代码如下

class Solution 
{
public:int m,n;int dx[4] = {1,-1,0,0};int dy[4] = {0,0,1,-1};int check[201][201] = {0};void bfs(vector<vector<char>>& board, int row, int col, char flag){queue<pair<int, int>> q;q.push({row, col});while (!q.empty()){int sz = q.size();while (sz--){auto [a, b] = q.front();q.pop();check[a][b] = 1;board[a][b] = flag;for (int i = 0; i < 4; i++){int x = a + dx[i], y = b + dy[i];if (x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'O' && !check[x][y]){q.push({x, y});check[x][y] = 1;}}}}}void solve(vector<vector<char>>& board) {m = board.size(), n = board[0].size();for (int i = 0; i < m; i++) {if (board[i][0] == 'O') bfs(board, i, 0, 'A');if (board[i][n-1] == 'O') bfs(board, i, n-1, 'A');}for (int j = 0; j < n; j++) {if (board[0][j] == 'O') bfs(board, 0, j, 'A');if (board[m-1][j] == 'O') bfs(board, m-1, j, 'A');}for (auto& v : board)for (auto& ch : v) if (ch == 'O') ch = 'X';else if (ch == 'A') ch = 'O';}
};

②BFS解决最短路问题

1. 迷宫中离入口最近的出口

题目链接:1926. 迷宫中离入口最近的出口 - 力扣(LeetCode)

解析:


http://www.mrgr.cn/p/24116883

相关文章

2010年认证杯SPSSPRO杯数学建模C题(第一阶段)高校图书馆的智能服务全过程文档及程序

2010年认证杯SPSSPRO杯数学建模 C题 高校图书馆的智能服务 原题再现&#xff1a; 图书馆源于保存记事的习惯。图书馆是为读者在馆内使用文献而提供的专门场所。而高校的图书馆为教学和科研服务&#xff0c;具有服务性和学术性强的特点。   现在的高校图书馆存在着许多不良的…

贪吃蛇游戏C语言破解:成为编程高手的必修课!

​ 个人主页&#xff1a;秋风起&#xff0c;再归来~ 文章专栏&#xff1a;C语言实战项目 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 1、游戏效果演示 贪吃蛇游戏效果演示 2、win32 A…

适合金融行业的FTP替代方案是怎么样的?仅需关注三个重点

2018 年以来,受“华为、中兴事件”影响,我国科技尤其是上游核心技术受制于人的现状对我 国经济发展提出了严峻考验。在全球产业从工业经济向数字经济升级的关键时期,中国明确 “数字中国”建设战略, 抢占数字经济产业链制高点。 在执行层面,从最关系国计民生的行业开始,也…

GPT-3.5和GPT-Plus的区别

GPT-3.5和GPT-Plus都是OpenAI开发的大型语言模型,但它们之间有一些区别: GPT-3.5就是大家熟知的ChatGPT GPT-Plus 是Open AI 的更强的AI模型GPT-4版本。两者区别是&#xff1a; 模型规模:GPT-Plus是GPT-3的一个更大版本,参数量更多。而GPT-3.5是GPT-3的一个优化版本,在参数量…

面试官:在原生input上面使用v-model和组件上面使用有什么区别?

文章解释了在原生input上面使用v-model和在组件上面使用v-model有什么区别?前言 还是上一篇面试官:来说说vue3是怎么处理内置的v-for、v-model等指令? 文章的那个粉丝,面试官接着问了他另外一个v-model的问题。面试官:vue3的v-model都用过吧,来讲讲。粉丝:v-model其实就…

工作效率倍增!9个设计网站推荐,让你事半功倍!

通常我们可以在网上看到很多设计咨询&#xff0c;可能是推荐网站&#xff0c;也可能是推荐软件&#xff0c;但是有时候一眼就过去了&#xff0c;什么都不记得了。今天给大家推荐几个我用的真的很酷的软件/网站&#xff0c;作为一个大集合和大家分享。 1.即时设计资源广场 即时…

Keepass安装使用方法(包含浏览器插件使用方法)

相关后续阅读:Keepass调用Xshell、SecureCRT、RDP、Putty的方法(一劳永逸版) 安装方法: 1、安装KeePass-2.56-Setup.exe,选择语言——English2、一路默认后,安装到默认路径:C:\Program Files\KeePass Password Safe 2 3、将语言包Chinese_Simplified.lngx解压拷贝到C:\P…

站立会议和燃尽图05

站立会议和燃尽图05 一、小组情况 组长:李宏威 组员:董泽豪 队名:隐约雷鸣 二、Scrum例会 时间:2024年4月21日 出席人员:李宏威,董泽豪 要求1 工作照片要求2 时间跨度 2024年4月23日 7:00 至 2024年4月23日 7:20 共计 20 分钟 要求3 地点 石家庄铁道大学 要求4 立会内容包…

古希腊掌管数据的神!铁威马全新SPC功能来袭!

在数字世界的深处,铁威马全新操作系统TOS 6如同一位强大的守护者,守护着无数珍贵的数据宝藏。而在这个守护者的队伍中,有一位特别的成员——SPC。 它像是一位冷静而敏锐的守门人,时刻警惕着任何可能对数据安全造成威胁的入侵者。它的存在,让TOS 6更加坚不可摧,为用户的数…

Link

How to link me.QQ : 1242981216 (加好友请备注来意,来自博客园) Vx : Mr77bond(加好友请备注来意,来自博客园) Github:7dragonpig (七龙猪) (github.com) Bilibili:迈克尔七龙猪的个人空间-迈克尔七龙猪个人主页-哔哩哔哩视频 (bilibili.com) Zhihu:迈克尔七龙猪 - 知乎…

将彩色图转化为灰度图及其原理介绍

本文介绍了彩色图与灰度图,为什么要转化为灰度图,及其转化为灰度图的原理,包含加权平均法与简单平均法,在明白了原理之后,直接使用OpenCV中提供的函数进行图像灰度处理,希望对你有所帮助。彩色图介绍 彩色图像是一种包含颜色信息的图像,通常由红色、绿色和蓝色(RGB)三…

ETL工具之Kettle使用方法

一、Kettle 简介1.1、Kettle是什么 Kettle是一款国外开源的ETL工具,纯Java编写,可以在Window、Linux、Unix上运行,绿色无需安装,数据抽取高效稳定。 Kettle 中文名称叫水壶,该项目的主程序员MATT希望把各种数据放到一个壶里,然后以一种指定的格式流出。 Kettle这个ETL工具…

第12課-Mirth生产环境宕机后基于服务配置XML备份恢复之记录

Mirth Connect作为集成交换平台,生产环境互联互通了众多系统,脑残的是连自家关键业务系统都依托mirth来进行交互,宕机或故障对身处其中的一次紧张的业务系统升级都造成高度的精神紧张;这种宕机经历多次之后,深感疲惫和无语;今天用生产环境低版本Mirth实践了一次恢复过程,…

2024华中杯C题光纤传感器平面曲线重建原创论文分享

大家好&#xff0c;从昨天肝到现在&#xff0c;终于完成了2024华中杯数学建模C题的完整论文啦。 给大家看一下目录吧&#xff1a; 目录 摘 要&#xff1a; 10 一、问题重述 12 二&#xff0e;问题分析 13 2.1问题一 13 2.2问题二 14 2.3问题三 14 三、模型假设 15 四、…

Learning To Count Everything实验过程记录

《Learning To Count Everything》CVPR2021 实验过程记录learn to count everything 实验过程及结果 demo测试:36个橘子换example box:adapt之后:在不适应的情况下对验证拆分进行测试 通过适应对 val 拆分进行测试 官方模型的test训练152轮得到模型,然后进行test作者:七…

小型网上书店——需求分析

一、实验题目 :需求分析 二、实验目的 1、掌握StarUML软件的安装; 2、掌握利用StarUML工具分析、设计、绘制用例图; 3、掌握利用StarUML工具分析、设计、绘制类图; 4、掌握利用StarUML工具分析、设计、绘制状态图; 5、掌握利用StarUML工具分析、设计、绘制顺序图。 6、掌握…

C#S7.NET实现西门子PLCDB块数据采集的完整步骤

前言 本文介绍了如何使用S7.NET库实现对西门子PLC DB块数据的读写,记录了使用计算机仿真,模拟PLC,自至完成测试的详细流程,并重点介绍了在这个过程中的易错点,供参考。用到的软件: 1.Windows环境下链路层网络访问的行业标准工具(WinPcap_4_1_3.exe)下载链接:https://w…

docker - [07] 部署ES+Kibana

思考问题:以后在Tomcat部署项目,如果每次都要进入容器会十分麻烦,是否可以在容器外部提供一个映射路径,webapps,在外部放置项目,自动同步到容器内部? 一、启动es docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node&q…

华为交换机重置密码

1.进入bootrom 加电后&#xff0c;18S左右&#xff0c;在启动菜单按 CtrlB 进入bootrom&#xff08;3s内&#xff09; 注意&#xff1a;本步骤属于高危操作&#xff0c;一定小心切勿删除系统或修改bootrom密码&#xff01; 输入bootrom密码&#xff0c;按6 看到提示成功后按…

查看端口被哪个服务或者进程占用

一.麒麟系统 1.查看端口被哪个服务或者进程占用 sudo netstat -anop | grep 57298 2.查看进程使用了哪个端口 sudo netstat -plunt | grep avahi-daemon二.window系统 cmd打开输入如下命令 netstat -ano | findstr 80 自己开发了一个股票智能分析软件,功能很强大,需要的关注微…