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

数据结构之BFS广度优先算法(腐烂的苹果)

队列这个数据结构在很多场景下都有使用,比如在实现二叉树的层序遍历,floodfill问题(等等未完成)中,都需要借助队列的先进先出特性,下面给出这几个问题的解法

经典的二叉树的层序遍历

算法图示,以下图所示的二叉树为例

二叉树层序遍历 C++代码实现

typedef struct binaryTreeNode {struct binaryTreeNode* left;struct binaryTreeNode* right;BTDataType data;
}BTNode;void levelOrder(BTNode* root)
{std::queue<BTNode*> nodeQ;if (root){nodeQ.push(root);}while (!nodeQ.empty()){BTNode* front = nodeQ.front();std::cout << front->data;if (front->left){nodeQ.push(front->left);}if (front->right){nodeQ.push(front->right);}nodeQ.pop();}
}

 注意:队列中存放的是二叉树中结点的指针,每次都去找队列的头部元素,通过头部元素找到其非空的左右孩子,并把头部元素出队列,此时出队列得到的序列就是二叉树的层序遍历序列

Floodfill问题之腐烂的苹果

(牛客网链接:腐烂的苹果_牛客题霸_牛客网 (nowcoder.com))

Flood Fill(泛洪填充)算法是一种图像处理的基本算法,用于填充连通区域。该算法通常从一个种子点开始,沿着种子点的相邻像素进行填充,直到遇到边界或者其他指定的条件为止。

如果用BFS的思想来解决这个问题,每次循环都只考虑队列中头元素的上下左右

需要考虑的有:

        1. 查看上下左右元素时不能发生越界

        2. 只将上下左右元素中为 1 的那些元素的二维坐标位置放到队列中

        3. 放到队列中的二维坐标位置设置为 true

           

代码实现 

int rotApple(vector<vector<int> >& grid) {int upanddown[4] = {0, 0, -1, 1};int leftandright[4] = {-1, 1, 0, 0};bool vis[1010][1010] = {false};int n = grid.size();int m = grid[0].size();queue<pair<int, int>> findtwoq;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (grid[i][j] == 2) {findtwoq.push({i, j});}}}int ret = 0;while (findtwoq.size()) {int sz = findtwoq.size();ret++;while (sz--) {auto [a, b] = findtwoq.front();findtwoq.pop();for (int i = 0; i < 4; i++) {int x = a + upanddown[i], y = b + leftandright[i];if (x >= 0 && x < n && y >= 0 && y < m && grid[x][y] == 1 && !vis[x][y]){vis[x][y] = true;findtwoq.push({x, y});}}}}for(int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (grid[i][j] == 1 && vis[i][j] == false) {return -1;}}}return ret - 1;
}

http://www.xdnf.cn/news/1027.html

相关文章:

  • ARINC818-1协议
  • visual Studio+Qt插件检查内存泄漏
  • Azure 私有端点和存储帐户用例
  • 基于springboot医药连锁店管理系统(源码+lw+部署文档+讲解),源码可白嫖!
  • 【论文精读】COLMAP-Free 3D Gaussian Splatting
  • vue入门:路由 router
  • [GESP202409 二级] 小杨的 N 字矩阵 题解
  • 《如何用 Function 实现动态配置驱动的处理器注册机制?》
  • Ubuntu多用户VNC远程桌面环境搭建:从零开始的完整指南
  • 多路由器通过三层交换机互相通讯(单臂路由+静态路由+默认路由版),通过三层交换机让pc端相互通讯
  • C++之类模板
  • 定制化突围:遨游防爆手机的差异化竞争策略
  • 实战|使用环信Flutter SDK构建鸿蒙HarmonyOS应用及推送配置
  • vue MarkdownIt标签多出了<p>标签导致高度变丑
  • 前端路由缓存实现
  • ServletContextAttributeListener 的用法笔记250417
  • MYSQL “Too Many Connections“ 错误解决
  • 【Python入门】文件读取全攻略:5种常用格式(csv/excel/word/ppt/pdf)一键搞定 | 附完整代码示例
  • Java基础系列-LinkedList源码解析
  • Vue项目Webpack Loader全解析:从原理到实战配置指南
  • MYOJ_11700(UVA10591)Happy Number(快乐数)(超快解法:图论思想解题)
  • JVM考古现场(二十二):降维打击·用二向箔优化内存模型
  • android如何在生产环境中做到详实的日志收集而不影响性能?
  • 算法之贪心算法
  • 【音视频】音视频FLV合成实战
  • Pikachu靶场-CSRF
  • Golang errors 包快速上手
  • 使用Qt multimedia模块实现简易的视频播放器
  • AI在能源消耗管理及能源效率提升中的核心应用场景及技术实现
  • Java性能剖析工具箱