【优选算法】BFS解决FloodFill算法

一、经验总结

什么是FloodFill算法?

FloodFill算法是一种用于填充连通区域的算法,通常用于图像处理和计算机图形学中。它从给定的起始点开始,向周围相邻的像素进行扩散填充,直到遇到边界或者其他指定条件停止。

FloodFill算法还可以用于统计连通块的数量,求各连通块的面积等。

BFS解决FloodFill算法

当使用BFS解决FloodFill算法时,可以从一个起始点开始,逐步向外扩展,一层层地遍历并填充相邻的空白区域。

需要注意的点:

  1. 使用队列来辅助实现BFS
  2. 创建横纵坐标的变化量数组,可以方便地遍历相邻地四个方向
  3. 可以使用两种方法防止重复地入队列访问:1.直接修改原数组 2.创建visited数组标记访问;不管是哪种方法都需要在元素入队列时进行修改,以防止同层元素的重复访问

二、相关编程题

2.1 图像渲染

题目链接

733. 图像渲染 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {typedef pair<int,int> PII;int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};
public:vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {int prev = image[sr][sc];if(color == prev) return image;int m = image.size(), n = image[0].size();queue<PII> que;que.push({sr,sc});image[sr][sc] = color;while(!que.empty()){auto [r, c] = que.front();que.pop();for(int i = 0; i < 4; ++i){int x = r+dx[i], y = c+dy[i];if(x>=0 && x<m && y>=0 && y<n && image[x][y]==prev){que.push({x, y});image[x][y] = color;}}}return image;}
};

2.2 岛屿数量

题目链接

200. 岛屿数量 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {typedef pair<int,int> PII;vector<vector<bool>> visited;int m, n;int dx[4] = {0, 0, -1, 1};int dy[4] = {1, -1, 0, 0};
public:int numIslands(vector<vector<char>>& grid) {m = grid.size(), n = grid[0].size();visited.resize(m, vector<bool>(n, false));int ret = 0;for(int i = 0; i < m; ++i){for(int j = 0; j < n; ++j){if(grid[i][j]=='1' && !visited[i][j]){++ret;BFS(grid, i, j);}}}return ret;}void BFS(vector<vector<char>>& grid, int sx, int sy){queue<PII> que;que.push({sx, sy});visited[sx][sy] = true;while(!que.empty()){auto [a, b] = que.front();que.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&&grid[x][y]=='1'&&!visited[x][y]){que.push({x,y});visited[x][y] = true;}}}}
};

2.3 岛屿的最大面积

题目链接

695. 岛屿的最大面积 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

同上,只需要在BFS的过程中顺便统计一下陆地面积即可(同样是在入队列时统计面积,防止重复记录)。

编写代码

class Solution {typedef pair<int,int> PII;vector<vector<bool>> visited;int m, n;int dx[4] = {0, 0, -1, 1};int dy[4] = {1, -1, 0, 0};
public:int maxAreaOfIsland(vector<vector<int>>& grid) {m = grid.size(), n = grid[0].size();visited.resize(m, vector<bool>(n, false));int area_max = 0;for(int i = 0; i < m; ++i){for(int j = 0; j < n; ++j){if(grid[i][j]==1 && !visited[i][j])area_max = max(area_max, BFS(grid, i, j));}}return area_max;}int BFS(vector<vector<int>>& grid, int sx, int sy){int area = 0;queue<PII> que;que.push({sx, sy});visited[sx][sy] = true;++area;while(!que.empty()){auto [a, b] = que.front();que.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&&grid[x][y]==1&&!visited[x][y]){que.push({x,y});visited[x][y] = true;++area;}}}return area;}
};

2.4 被围绕的区域

题目链接

130. 被围绕的区域 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {int m, n;int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};
public:void solve(vector<vector<char>>& board) {m = board.size(), n = board[0].size();//1.先将边界上的'O'连通块修改为'.'for(int i = 0; i < m; ++i){if(board[i][0] == 'O') BFS(board, i, 0);if(board[i][n-1] == 'O') BFS(board, i, n-1);}for(int j = 0; j < n; ++j){if(board[0][j] == 'O') BFS(board, 0, j);if(board[m-1][j] == 'O') BFS(board, m-1, j);}//2.将剩下的'O'改为'X',边界上的'.'改回'O'for(int i = 0; i < m; ++i){for(int j = 0; j < n; ++j){if(board[i][j] == 'O') board[i][j] = 'X';if(board[i][j] == '.') board[i][j] = 'O';}}}void BFS(vector<vector<char>>& board, int sx, int sy){queue<pair<int,int>> que;que.push({sx, sy});board[sx][sy] = '.';while(!que.empty()){auto [a,b] = que.front();que.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&&board[x][y]=='O'){que.push({x,y});board[x][y] = '.';}}}}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/24993.shtml

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

相关文章

新买的移动硬盘无法识别

文章目录 背景解决方案 背景 同事新买的移动硬盘&#xff0c;插在电脑上识别不出来盘符&#xff0c;检查了一下&#xff0c;硬盘没问题应该&#xff0c;是ssk的硬盘盒M.2的SSD&#xff0c;硬盘驱动也是正常的&#xff0c;插拔了几次&#xff0c;都不识别&#xff0c;换了太电脑…

【Java】解决Java报错:OutOfMemoryError

文章目录 引言1. 错误详解2. 常见的出错场景2.1 内存泄漏2.2 大数据结构2.3 JVM内存参数配置不当 3. 解决方案3.1 内存泄漏检测与修复3.2 优化数据结构3.3 调整JVM内存参数3.4 使用弱引用 4. 预防措施4.1 定期进行内存分析4.2 合理设计数据结构4.3 使用合适的JVM内存参数4.4 优…

Mysql使用中的性能优化——批量插入的规模对比

在《Mysql使用中的性能优化——单次插入和批量插入的性能差异》中&#xff0c;我们观察到单次批量插入的数量和耗时呈指数型关系。 这个说明&#xff0c;不是单次批量插入的数量越多越好。本文我们将通过实验测试出本测试案例中最佳的单次批量插入数量。 结论 本案例中约每次…

【云岚到家】-day00-开发环境配置

文章目录 1 开发工具版本2 IDEA环境配置2.1 编码配置2.2 自动导包设置2.3 提示忽略大小写2.4 设置 Java 编译级别 3 Maven环境3.1 安装Maven3.2 配置仓库3.3 IDEA中配置maven 4 配置虚拟机4.1 导入虚拟机4.2 问题 5 配置数据库环境5.1 启动mysql容器5.2 使用MySQL客户端连接数据…

【YOLO系列】YOLOv1学习(PyTorch)原理加代码

论文网址&#xff1a;https://arxiv.org/pdf/1506.02640 训练集博客链接&#xff1a;目标检测实战篇1——数据集介绍(PASCAL VOC&#xff0c;MS COCO)-CSDN博客 代码文件&#xff1a;在我资源里&#xff0c;但是好像还在审核&#xff0c;大家可以先可以&#xff0c;如果没有的…

从 Android 恢复已删除的备份录

本文介绍了几种在 Android 上恢复丢失和删除的短信的方法。这些方法都不能保证一定成功&#xff0c;但您可能能够恢复一些短信或其中存储的文件。 首先要尝试什么 首先&#xff0c;尝试保留数据。如果你刚刚删除了信息&#xff0c;请立即将手机置于飞行模式&#xff0c;方法是…

【Linux】信号(二)

上一章节我们进行了信号产生的讲解。 本节将围绕信号保存展开&#xff0c;并会将处理部分开一个头。 目录 信号保存&#xff1a;信号的一些概念&#xff1a;关于信号保存的接口&#xff1a;sigset_t的解释&#xff1a;对应的操作接口&#xff1a;sigprocmask&#xff1a;sigp…

SwiftUI中Preference的理解与使用(ScrollView偏移量示例)

在 SwiftUI 中&#xff0c;Preference用于从视图层次结构的较深层次向上传递信息到较浅层次。这通常用于在父视图中获取子视图的属性或状态&#xff0c;而不需要使用状态管理工具如State或 ObservableObject。Preference特别用于自定义布局或组件&#xff0c;其中子视图需要向父…

Eslint配置指南

1. Eslint配置指南 1.1. 安装 ESLint1.2. 生成配置文件1.3. 修改配置文件1.4. 创建 .eslintignore 文件1.5. 运行 ESLint1.6. 整合到编辑器/IDE1.7. 自动修复 2. 配置prettier 2.1. 安装依赖包2.2. .prettierrc.json添加规则2.3. .prettierignore忽略文件2.4. 保存自动格式化 3…

实战 | 通过微调SegFormer改进车道检测效果(数据集 + 源码)

背景介绍 SegFormer&#xff1a;实例分割在自动驾驶汽车技术的快速发展中发挥了关键作用。对于任何在道路上行驶的车辆来说&#xff0c;车道检测都是必不可少的。车道是道路上的标记&#xff0c;有助于区分道路上可行驶区域和不可行驶区域。车道检测算法有很多种&#xff0c;每…

vue2实现将el-table表格数据导出为长图片

方法一、 el-table数据导出为长图片 将el-table数据导出为图片不是一个直接的功能&#xff0c;但可以通过以下步骤实现&#xff1a; 使用html2canvas库将表格区域转换为画布(canvas)。 使用canvas的toDataURL方法将画布导出为图片格式&#xff08;例如PNG&#xff09;。 创建…

数据结构--实验

话不多说&#xff0c;直接启动&#xff01;&#x1f44c;&#x1f923; 目录 一、线性表&#x1f60e; 1、建立链表 2、插入元素 3、删除特定位置的元素 4、输出特定元素值的位置 5、输出特定位置的元素值 6、输出整个链表 实现 二、栈和队列&#x1f618; 栈 顺序栈 …

将web项目打包成electron桌面端教程(一)vue3+vite+js

说明&#xff1a;后续项目需要web端和桌面端&#xff0c;为了提高开发效率&#xff0c;准备直接将web端的代码打包成桌面端&#xff0c;在此提前记录一下demo打包的过程&#xff0c;需要注意的是vue2或者vue3的打包方式各不同&#xff0c;如果你的项目不是vue3vitejs&#xff0…

数字孪生技术体系和核心能力整理

最近对数字孪生技术进行了跟踪调研学习,整理形成了调研成果,供大家参考。通过学习,发现数字孪生技术的构建过程其实就是数字孪生体的构建与应用过程,数字孪生体的构建是一个体系化的系统工程,数字化转型的最终形态应该就是数实融合互动互联的终极状态。数实融合是每个行业…

[每周一更]-(第100期):介绍 goctl自动生成代码

​ 在自己组件库中&#xff0c;由于部分设计会存在重复引用各个模板的文件&#xff0c;并且基础架构中需要基础模块内容&#xff0c;就想到自动生成代码模板&#xff0c;刚好之前有使用过goctl&#xff0c;以下就简单描述下gozero中goctl场景和逻辑&#xff0c;后续自己借鉴将自…

英语学习笔记32——What‘s he/she/it doing?

What’s he/she/it doing? 他/她/它 正在做什么&#xff1f; 词汇 Vocabulary type /taɪp/ v. 打字 n. 类型&#xff0c;签字 ing形式&#xff1a;typeing 用法&#xff1a;this type of …    这种类型的…… 例句&#xff1a;我喜欢这种苹果。    I like this type…

java自学阶段二:JavaWeb开发--day80(项目实战2之苍穹外卖)

《项目案例—黑马苍穹外卖》 目录&#xff1a; 学习目标项目介绍前端环境搭建(前期直接导入老师的项目&#xff0c;后期自己敲&#xff09;后端环境搭建&#xff08;导入初始项目&#xff0c;新建仓库使用git管理项目&#xff0c;新建数据库&#xff0c;修改登录功能&#xff…

[office] 如何在Excel中拉动单元格时表头不变形- #学习方法#职场发展#经验分享

如何在Excel中拉动单元格时表头不变形? 如何在Excel中拉动单元格时表头不变形&#xff1f;Excel是我们常用的办公软件&#xff0c;当我们使用Excel拉动单元格时表头不变形&#xff0c;该如何操作呢&#xff0c;下面小编就为大家做详细讲解 如何在Excel中拉动单元格时表头不变…

用户输入表格数据设计(XPTable控件使用说明九)

XP Table控件可以编辑数据&#xff0c;程序也可以使用编辑后的数据&#xff0c;但是程序新建时又从初始化数据到模型到显示&#xff0c;这两步有点绕&#xff0c;做了一个实例来说明这块内容。 流程1&#xff1a;初始化数据--> model--> UI show 流程2&#xff1a;UI--…

skywalking基础使用

skywalking基础使用 找链路追踪Id将链路追踪Id拿到skywalking-ui中筛选对应链路补充说明例如, sql的打印能让我们了解到代码中对应的sql是否符合预期 找链路追踪Id 在接口响应header中复制x-trace-id 这个接口响应正常了, 异常没有暴露到前端, 且调用链路很长, 但我们借助s…