BFS:FloodFill算法

文章目录

  • FloodFill算法简介
  • 1.图像渲染
  • 2.岛屿数量
  • 3.岛屿的最大面积
  • 4.被围绕的区域
  • 总结

在这里插入图片描述

FloodFill算法简介

Flood Fill算法是一种用于确定与某个给定节点相连的区域的算法,常用于计算机图形学和图像处理。该算法可以用于诸如填充多边形、检测连通区域等任务。Flood Fill算法有多种实现方式,其中最常见的是递归方法和使用栈或队列的迭代方法。

基本思想
Flood Fill算法从一个初始像素开始,检查该像素的颜色。如果颜色匹配(即需要填充的颜色),则将其填充为新的颜色,然后对相邻的像素重复这一过程,直到所有相连的匹配像素都被填充为止。

在这里插入图片描述
FloodFill算法也叫洪水灌溉法,上图中0表示岛屿,1表示海洋,如果要我们求岛屿的个数的话就可以用洪水灌溉法则。

在这里插入图片描述

灌溉之后就像上面一样。
接下来,我们来练习几道题熟悉一下FloodFill算法。

1.图像渲染

题目链接
题目:

在这里插入图片描述

样例输入和输出:

在这里插入图片描述

这道题的意思很简单,就是我们固定一个位置,这个位置的坐标是[sr,sc]这个位置周围的和这个这个区块数字相同数都会被变成新的数字。
以上面这个例子为例,初始坐标是中间坐标,那么渲染的区块就是:
在这里插入图片描述
在这里插入图片描述
如果利用FloodFill算法的话,我们按顺序灌溉应该是1->2->3->4。

算法原理:
利用BFS的FloodFill算法,这个算法我们只需要借助队列,每次入队列的时候改变当前节点的值。

代码展示:

class Solution {
public:typedef pair<int,long> PIL;//定义一个方向数组,上下左右四个位置int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {//标记一下需要修改的像素值int prev=image[sr][sc];int m=image.size();int n=image[0].size();if(prev==color){return image;//处理边界情况}queue<PIL> q;q.push({sr,sc});while(q.size()){auto [a,b]=q.front();q.pop();image[a][b]=color;for(int i=0;i<4;i++){int x=a+dx[i];int y=b+dy[i];if(x>=0&&x<m&&y>=0&&y<n&&image[x][y]==prev){q.push({x,y});}}}return image;}
};

2.岛屿数量

题目链接
题目:

在这里插入图片描述

样例输入和输出:

在这里插入图片描述

我们来看示例1:
在这里插入图片描述
这道题1是岛屿,0是海,然后这个数组的周围默认都是海。

算法原理:
这道题和上道题的思路是一样的,但是还多出来一步,就是当我们利用bfs来遍历数组的时候,假如我们从第一个位置开始遍历,遍历了一遍,记录了一个岛屿,但是我们第二次遍历的时候从第二个位置的1开始遍历,但是第二个位置的1是属于第一个岛屿的,所以这里就会产生重复,解决这种重复问题的办法就是开一个bool类型的vis数组,这个数组的大小和给定的数组的大小是相同的,我们每访问一个岛屿就将这个岛屿上对应的vis变为true,表示我们已经访问过这个节点了,所以这里进行bfs的条件多了一个不仅需要这个节点的值是1,还需要这个节点对应的vis数组是true。

代码展示:

class Solution {
public:typedef pair<int,int> PIL;int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};bool vis[301][301];int ret=0;int m,n;void bfs(vector<vector<char>>& grid,int i,int j){queue<PIL> q;q.push({i,j});vis[i][j]=false;while(q.size()){auto [a,b]=q.front();q.pop();for(int k=0;k<4;k++){int x=a+dx[k];int y=b+dy[k];if(x < m && x >= 0 && y >= 0&&y<n&&grid[x][y]=='1'&&vis[x][y]==false){vis[x][y]=true;q.push({x,y});}}}}int numIslands(vector<vector<char>>& grid) {m=grid.size();n=grid[0].size();for(int i=0;i<grid.size();i++){for(int j=0;j<grid[i].size();j++){if(grid[i][j]=='1'&&vis[i][j]==false){bfs(grid,i,j);//将这个陆地标记一下ret++;}}}return ret;}
};

3.岛屿的最大面积

题目链接
题目:

在这里插入图片描述

样例输入和输出:

在这里插入图片描述

这道题的背景和上一道题是一样的,但是这道题不是让我们求岛屿的数量而是让我们求所有岛屿中面积最大的那个岛屿大面积

算法原理:
这道题需要的变量和上道题也是一样的,但是唯一不同的一点是上一道题是void,这道题是int,所以我们需要记录每次BFS的结果,我们用S记录每次BFS的结果,然后每次BFS之后,和前一次求出来的面积进行比较,最后直接返回最大值。

代码展示:

class Solution {
public:typedef pair<int,int> PIL;int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};bool vis[51][51];int m,n;int S;int bfs(vector<vector<int>>& grid,int i,int j){int Sum=0;queue<PIL> q;q.push({i,j});Sum++;vis[i][j]=true;while(q.size()){auto [a,b]=q.front();q.pop();for(int k=0;k<4;k++){int x=a+dx[k];int y=b+dy[k];if(x>=0&&x<m&&y>=0&&y<n&&grid[x][y]==1&&vis[x][y]==false){vis[x][y]=true;q.push({x,y});Sum++;}}}return Sum;}int maxAreaOfIsland(vector<vector<int>>& grid) {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&&vis[i][j]==false){int S1=bfs(grid,i,j);if(S<S1){S=S1;}}}}return S;}
};

4.被围绕的区域

题目链接
题目:

在这里插入图片描述

样例输入和输出:

在这里插入图片描述

这道题给出的二维数组中的值只有X和O,这道题的意思就是让我们修改被x包围的O为x,然后边界的联通区域不需要修改。
我们用一个例子来表示上面的题意:
在这里插入图片描述

蓝色区域表示不能修改的边界联通区域,灰色区域表示被X围住的中间的需要修改的联通区域。

算法原理,如果这道题我们直接正面做的话,很难,因为当我们进行BFS的时候,我们并不知道这块区域是边界联通的区域,就像下面这种情况:
在这里插入图片描述
上面这种情况,当我们从第一个位置开始BFS我们到后面才知道这个联通区域是边界区域,但是我们又不能倒过去找,所以我们只能先标记这个边界区域,然后再用一次BFS对可修改区域进行修改,所以这里我们先对边界区域进行遍历,先把边界区域修改为另一个字符,这里我们将这个字符定义为’*'修改了之后,我们只需要对这个二维数组遍历一遍,将O修改为X,将 *修改为O即可。

代码展示:

class Solution {
public:typedef pair<int,int> PII;int m,n;int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};void bfs(vector<vector<char>>& board,int i,int j){queue<PII> q;q.push({i,j});board[i][j]='*';while(q.size()){auto [a,b]=q.front();q.pop();for(int k=0;k<4;k++){int x=a+dx[k];int y=b+dy[k];if(x>=0&&x<m&&y>=0&&y<n&&board[x][y]=='O'){q.push({x,y});board[x][y]='*';}}}}void solve(vector<vector<char>>& board) {m=board.size();n=board[0].size();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);}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 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';}}}
};

总结

Flood Fill算法在图像处理和计算机图形学中扮演着重要角色。无论是用于简单的填色任务,还是复杂的区域检测,这一算法都展示了其强大的功能。本文详细介绍了Flood Fill算法的基本思想,并提供了递归和迭代两种实现方式。递归方法虽然简单直观,但在处理较大图像时可能会遇到递归深度的限制;而迭代方法则通过显式管理待填充的像素,克服了这一问题。

通过这两种实现方法的比较,我们不仅了解了Flood Fill算法的原理,也掌握了如何选择合适的实现方式来应对不同的应用场景。希望这篇博客能帮助大家更好地理解和应用Flood Fill算法,在实际项目中解决相关问题。

如果您有任何问题或需要进一步讨论,欢迎在评论区留言。感谢您的阅读!

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

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

相关文章

简答分享python学习进修网站

一、网战推荐 CodeCombat 是一款网页编程游戏。这款编程游戏借鉴了游戏很多设计元素&#xff0c;游戏剧情十分丰富。Codecombat能够学习Python多种语言&#xff0c;这些语言能够运用到游戏设计、网页应用、app的开发上。 Checkio 是一个基于浏览器的游戏&#xff0c;你需要使…

做电池研究如何发表Nature Communications,案例分析

✨【元素魔方学术俱乐部】✨ &#x1f469;‍&#x1f3eb;&#x1f468;‍&#x1f3eb;我们创建了一个学术交流群 给全国各地以及各种研究方向的硕博 和老师们提供一个交流的平台&#x1f4da;&#x1f9ea; 感兴趣的话欢迎加入 &#x1f4f2;本公众号中回复“社群” 会自动发…

Lynred在欧洲防务展上将展出新品——“HOT”红外传感器Seegnus。

Lynred在即将举办的巴黎欧洲防务展上将展出其令人瞩目的新品——“HOT”红外传感器Seegnus。这款专为战术视觉设计的大型阵列传感器&#xff0c;以其紧凑的封装和高分辨率的中波红外成像能力&#xff0c;无疑将为航空航天、国防和商业市场带来革命性的突破。 Seegnus传感器拥有…

RX数据集成:信创生态下的平滑过渡方案

过去&#xff0c;众多中国企业倾向于采用国际供应商的数据集成产品与方案。其中Informatica作为行业翘楚&#xff0c;以其卓越性能和技术领先地位赢得了全球500强中95%企业的青睐。在中国市场上&#xff0c;众多企业同样信赖并采纳其解决方案。然而&#xff0c;随着国际环境的演…

vsfpt搭建配置文件,自用

yum install vsftpd useradd xh passwd xh为了确保用户 xh 拥有 /home/xh 目录的正确权限&#xff0c;可以使用以下命令&#xff1a; 更改目录的所有者和用户组&#xff1a; 确保 /home/xh 目录的所有者和用户组都设置为 xh&#xff1a; sudo chown -R xh:xh /home/xh设置目录权…

数据仓库的挑战

建设数据仓库是一个复杂且资源密集的过程&#xff0c;需要考虑多个方面。以下是建设数据仓库时常见的挑战及其详细解释&#xff1a; 1. 数据集成 挑战&#xff1a; 数据来源多样&#xff1a;数据来自不同的系统、数据库、文件格式&#xff08;如CSV、JSON、XML&#xff09;、…

威泰视信嵌入式软件工程师笔试题

威泰视信嵌入式软件工程师笔试题答题时间 45分钟 选择题 1、以下不需要编译内核的情况是 A、删除系统不用的设备驱动程序时 B、升级内核时 C、添加新硬件时 D、激活网卡 只要你代码或配置有改动&#xff0c;都要重新编译的&#xff0c;只是如果代码写成块模式的&#xff…

【LLM之RAG】RAT论文阅读笔记

研究背景 近年来&#xff0c;大型语言模型&#xff08;LLMs&#xff09;在各种自然语言推理任务上取得了显著进展&#xff0c;尤其是在结合大规模模型和复杂提示策略&#xff08;如链式思维提示&#xff08;CoT&#xff09;&#xff09;时。然而&#xff0c;LLMs 在推理的事实…

.net8 blazor auto模式很爽(三)用.net8的Blazor自动模式测试,到底在运行server还是WebAssembly

Blazor自动模式到底什么时侯在运行server&#xff0c;什么时侯在运行WebAssembly。这个对我们来说非常重要&#xff0c;官方并没有很清楚地告诉我们。并且存在一些误导&#xff0c;让我们觉得自动模式就是不管我怎么弄&#xff0c;blazor都会自动识别该使用server还是WebAssemb…

【无标题】安卓app 流量

该工具可以用于安卓app 流量&#xff0c;内存&#xff0c;cpu&#xff0c;fps等专项内容测试&#xff0c;并且有整机内存&#xff0c;cpu对比&#xff0c;还可监控手机网速&#xff0c;app流量&#xff0c;数据导出等功能&#xff0c;重点还是免费&#xff0c;毕竟PerfDog收费了…

运维:k8s常用命令大全

Kubernetes是一个强大的容器编排平台&#xff0c;不管是运维、开发还是测试或多或少都会接触到&#xff0c;熟练的掌握k8s可大大提高工作效率和强化自身技能。 集群管理 1. 查看集群节点状态: kubectl get nodes 2. 查看集群资源使用情况: kubectl top nodes 3. 查看集群…

Ubuntu 安装 CloudCompare

步骤&#xff1a; sudo apt install flatpakflatpak install flathub org.cloudcompare.CloudCompare此时会有报错&#xff1a; error: No remote refs found similar to ‘flathub’执行 flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.fla…

【IDEA】Spring项目build失败

通常因为环境不匹配需要在file->projectstructure里面调整一下。

详解DAC数模转换+DAC输出模拟电压的测量比对实验程序

前言&#xff1a;详解DAC数模转换原理DAC输出模拟电压的测量比对实验程序&#xff08;使用 DAC 通道 1 输出模拟电压&#xff0c;然后通过 ADC1 的通道 1 对该输出电压进行读取&#xff0c;并显示在 LCD 模块上面&#xff0c;DAC 的输出电压可以通过按键&#xff08;或 USMART&…

了解CDN:提升网络性能和安全性的利器

在当今的数字时代&#xff0c;网站性能和安全性是每一个网站管理员必须关注的核心问题。内容分发网络&#xff08;CDN&#xff0c;Content Delivery Network&#xff09;作为解决这一问题的重要工具&#xff0c;逐渐成为主流。本文将详细介绍CDN的定义、作用及其工作原理&#…

小白学react之Next.js 14(一)不配置路由的玩法

Next.js 14是目前最新版本&#xff0c;我们用就用最新的玩一下。 建一个示例之后&#xff0c;我在找配置&#xff0c;我应该在那建一个新的页面。找半天硬是没找着&#xff0c;答案是现在不需要配置。 我们来看一下Next.js 14的项目结构&#xff1a; 很明显&#xff0c;在src/…

c#基础知识---调用方法

1.可以使用方法名调用方法。下面的实例演示了这点&#xff1a; using System;namespace CalculatorApplication {class NumberManipulator{public int FindMax(int num1, int num2){/* 局部变量声明 */int result;if (num1 > num2)result num1;elseresult num2;return re…

李光明从程序员到架构师的逆袭之路(七)

来上海已经七天了&#xff0c;今天是梅雨季节里难得的一个雨天。我站在窗前&#xff0c;看着窗外绵绵细雨&#xff0c;淅淅沥沥地敲打着窗户&#xff0c;街上行人匆匆&#xff0c;雨伞成为了这道灰暗风景中的一抹亮色。梅雨让整座城市都笼罩在湿润而沉闷的氛围中&#xff0c;出…

【AI应用探讨】—智谱清言模型应用场景

目录 1. 企业与商业领域 1.1 客户服务与支持 1.2 市场营销 1.3 内容创作与生成 2. 教育与学习领域 2.1 智能教学助手 2.2 自主学习与辅导 2.3 考试与测评 3. 科研与学术领域 3.1 科研文献生成 3.2 学术问答与讨论 4. 个人生活与娱乐领域 4.1 智能家居助手 4.2 娱…

【AI应用探讨】—chatGPT小型化应用场景

目录 一、技术挑战与解决方案 1. 技术挑战 2. 解决方案 二、具体应用场景 1. 边缘设备部署 2. 嵌入式系统 3. 移动应用 4. 云服务 三、实施细节 1. 训练与微调 2. 评估与优化 3. 部署与监控 一、技术挑战与解决方案 1. 技术挑战 性能下降&#xff1a;随着模型尺寸…