算法——BFS算法

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.hqwc.cn/news/650997.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一篇文章带您了解java的API-String

1.为什么要学习字符串的处理&#xff1f; 在开发中需要大量的使用字符串&#xff0c;比如登录注册&#xff0c;留言之类的。 根据java的api文档中可知&#xff0c;String类表示字符串&#xff0c;java中的所有字符串都实现为此类的实例。 字符串是不变的&#xff0c;他们的值…

【linux】匿名管道|进程池

1.进程为什么要通信&#xff1f; 进程也是需要某种协同的&#xff0c;所以如何协同的前提条件(通信) 通信数据的类别&#xff1a; 1.通知就绪的 2.单纯的数据 3.控制相关的信息 2.进程如何通信&#xff1f; 进程间通信&#xff0c;成本会高一点 进程间通信的前提&#xff0c;先…

全志ARM-网络链接

命令扫描周围的WIFI热点 nmcli dev wifi 命令接入网络 nmcli dev wifi connect &#xff08;WiFi名&#xff0c;不要有空格&#xff09;password (WiFi密码) 查看IP地址 ip addr show wlan0或ifconfig 出现successfully就连接成功了

C++:const成员和取地址操作符

目录 一、const成员 二、取地址及const取地址操作符重载 一、const成员 将const修饰的“成员函数”称之为const成员函数&#xff0c;const修饰类成员函数&#xff0c;实际修饰该成员函数 隐含的this指针&#xff0c;表明在该成员函数中不能对类的任何成员进行修改。 注&…

【算法基础实验】图论-深度优先搜索和深度优先路径

深度优先(DFS) 理论基础 深度优先搜索&#xff08;DFS, Depth-First Search&#xff09;是图和树的遍历算法中的一种&#xff0c;它从一个节点开始&#xff0c;沿着树的边走到尽可能深的分支&#xff0c;直到节点没有子节点为止&#xff0c;然后回溯继续搜索下一个分支。DFS …

超全面的软件测试面试题

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 测试技术面试题 1、什么是兼容性测试&#xff1f;兼容性测试侧…

公众号偷偷“干大事”,公众号“留言”功能已可直接开通

在微信公众号的运营过程中&#xff0c;许多运营者都面临着一个令人头疼的问题&#xff0c;那就是自2018年以后注册的微信公众号无法再自带留言功能。这一变化是根据微信官方的通知而实施的。具体来说&#xff0c;自2018年2月12日起&#xff0c;微信对新注册的公众号进行了调整&…

白平衡简介

文章目录 白平衡的概念白平衡的调节常见的白平衡模式 白平衡的概念 白平衡是指摄影、摄像和显示技术中的一项重要概念&#xff0c;用于调节图像中的白色或中性灰色的色彩&#xff0c;使其看起来在不同光源条件下都是准确的白色或灰色。白平衡的主要目的是确保图像的色彩准确性…

OSPF域间路由防环原则

1.域间路由防环原则 ①原则一 1&#xff09;为了避免区域间的环路&#xff0c;OSPF规定不同区域间的路由交互只能通过ABR实现。 2&#xff09;ABR是连接到骨干区域的&#xff0c;所以在区域设计上规定&#xff0c;所有非骨干区域都要连接到骨干区域。区 域间的通讯需要通…

公钥密码学Public-Key Cryptography

公钥或非对称密码学的发展是整个密码学历史上最伟大的&#xff0c;也许是唯一真正的革命。The development of public-key, or asymmetric, cryptography is the greatest and perhaps the only true revolution in the entire history of cryptography. 公钥算法基于数学函数…

visual studio python输出中文乱码问题

之前在网上搜了一大堆教程花费了我半天时间&#xff0c;发现都没解决我的问题 最终问了好几次gtp才解决了问题 所以制作了这期教程以防自己搞忘 1.首先先看问题我们这里输出“你好世界会直接出现乱码问题” 这是因为我们这里高级保存选项没有用UTF-8编码&#xff0c;把它改…

关于pdf.js中文本坐标尺寸的使用

一个电子教材项目中有这样一个需求&#xff1a; 用户向网站上传一个PDF书籍后&#xff0c;网站可以对PDF书籍进行解析&#xff0c;并支持用户对PDF书籍的每一页做一些操作&#xff0c;比如&#xff1a;为英语课本的单词和句子添加音频热区。因为热区数量很多&#xff0c;所以&a…