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

BFS与Flood Fill:算法原理、实现细节与复杂度分析

目录

1. 概述

2. BFS 的基本原理

3. Flood Fill 算法

4. BFS 实现 Flood Fill 的步骤

5. C++ 实现

6. 代码解析

7. 复杂度分析

8. 应用场景

总结


1. 概述

        Flood Fill 算法是一种用于填充封闭区域的算法,常用于图像处理、绘图工具和游戏开发中。BFS(广度优先搜索)是解决 Flood Fill 问题的一种有效方法,特别适用于矩阵或网格中的区域填充。

2. BFS 的基本原理

        BFS 是一种图遍历算法,从起始点开始,逐层向外扩展,直到遍历完所有可达节点。BFS 使用队列来存储待访问的节点,确保按照层级顺序访问。

3. Flood Fill 算法

        Flood Fill 算法的目标是从一个起始点开始,填充所有与之相连且满足特定条件的区域。常见的应用包括图像中的颜色填充、迷宫求解等。

4. BFS 实现 Flood Fill 的步骤

  1. 初始化:选择一个起始点,并将其颜色更改为目标颜色。

  2. 队列操作:将起始点加入队列。

  3. 遍历:从队列中取出一个点,检查其相邻的点(上下左右),如果相邻点满足条件(如颜色相同),则将其颜色更改为目标颜色,并将其加入队列。

  4. 重复:重复步骤3,直到队列为空。

5. C++ 实现

以下是一个使用 BFS 实现 Flood Fill 的 C++ 代码示例:

#include <iostream>
#include <vector>
#include <queue>using namespace std;// 定义方向数组,表示上下左右四个方向
const int dx[] = {-1, 1, 0, 0};
const int dy[] = {0, 0, -1, 1};void floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) {int oldColor = image[sr][sc];if (oldColor == newColor) return; // 如果新旧颜色相同,直接返回int rows = image.size();int cols = image[0].size();queue<pair<int, int>> q;q.push({sr, sc});image[sr][sc] = newColor;while (!q.empty()) {auto current = q.front();q.pop();int x = current.first;int y = current.second;for (int i = 0; i < 4; ++i) {int nx = x + dx[i];int ny = y + dy[i];if (nx >= 0 && nx < rows && ny >= 0 && ny < cols && image[nx][ny] == oldColor) {image[nx][ny] = newColor;q.push({nx, ny});}}}
}int main() {vector<vector<int>> image = {{1, 1, 1},{1, 1, 0},{1, 0, 1}};int sr = 1, sc = 1, newColor = 2;floodFill(image, sr, sc, newColor);for (const auto& row : image) {for (int pixel : row) {cout << pixel << " ";}cout << endl;}return 0;
}

6. 代码解析

  • 方向数组dx 和 dy 数组用于表示上下左右四个方向的移动。

  • 队列:使用 queue<pair<int, int>> 来存储待处理的像素点。

  • 边界检查:在遍历相邻点时,检查是否越界。

  • 颜色更新:如果相邻点的颜色与起始点颜色相同,则更新其颜色并加入队列。

7. 复杂度分析

  • 时间复杂度:O(M*N),其中 M 和 N 分别是图像的行数和列数。每个像素最多被访问一次。

  • 空间复杂度:O(M*N),最坏情况下队列中可能存储所有像素点。

8. 应用场景

  • 图像处理:填充图像中的封闭区域。

  • 游戏开发:地图填充、迷宫求解等。

  • 计算机图形学:区域选择、颜色填充等。

总结

        BFS 是一种高效且易于实现的算法,适用于 Flood Fill 问题。通过逐层扩展,BFS 能够确保所有符合条件的区域都被填充。在实际应用中,BFS 的队列实现和边界检查是关键点,确保算法的正确性和效率。

相关文章:

BFS与Flood Fill:算法原理、实现细节与复杂度分析

目录 1. 概述 2. BFS 的基本原理 3. Flood Fill 算法 4. BFS 实现 Flood Fill 的步骤 5. C 实现 6. 代码解析 7. 复杂度分析 8. 应用场景 总结 1. 概述 Flood Fill 算法是一种用于填充封闭区域的算法&#xff0c;常用于图像处理、绘图工具和游戏开发中。BFS&#xff08…...

计算机网络基础杂谈(局域网、ip、子网掩码、网关、DNS)

目录 1. 简单局域网的构成 2. IP 地址 3. 子网掩码 4. IP地址详解自定义IP 5. IP 地址详解 6. 网关 7. DNS 域名解析 8. ping 1. 简单局域网的构成 交换机是组建局域网最重要的设备&#xff0c;换句话说&#xff0c;没有交换机就没法搭建局域网 交换机不能让局域网连…...

雷龙CS SD NAND(贴片式TF卡)测评体验

一、产品概述 近期获赠雷龙科技&#xff08;Longsto&#xff09;推出的CS系列贴片式SD NAND存储解决方案&#xff0c;包含两片工业级贴片式NAND芯片&#xff08;CSNP16GCR01-AOW&#xff09;及全兼容转接板。该方案支持TF卡形态扩展&#xff0c;实现高可靠性嵌入式存储应用。 …...

【Alertmanager】alertmanager告警系统原理剖析与应用实战,应有尽有非常全面

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...

Java——权限修饰符

一、权限修饰符的继承访问规则 以下按访问范围从宽到窄排序&#xff1a; 修饰符同包同类同包子类同包非子类跨包子类跨包非子类public✔️✔️✔️✔️✔️protected✔️✔️✔️✔️❌默认&#xff08;包级&#xff09;✔️✔️✔️❌❌private✔️❌❌❌❌ 关键点&#xf…...

一周学会Flask3 Python Web开发-redirect重定向

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 前面我们学过渲染到模板页面&#xff0c;这个其实是一种内部的转发&#xff0c;浏览器地址栏地址没有变化。如果我们想重定向…...

python面向对象:方法

1. 实例方法 实例方法用于操作实例变量&#xff0c;必须包含 self 参数。 class Person:def __init__(self, name):self.name namedef greet(self):print(f"Hello, my name is {self.name}")person1 Person("Alice") person1.greet() # 输出&#xff…...

物联网简介集合

物联网&#xff08;IoT&#xff09;指的是物理设备&#xff08;如电器和车辆&#xff09;之间的互联互通。这些设备嵌入了软件、传感器和连接功能&#xff0c;使其能够相互连接并交换数据。这项技术实现了从庞大的设备网络中收集和共享数据&#xff0c;为打造更高效、自动化的系…...

centos下使用pyenv管理python版本

在 CentOS 上安装 pyenv 和 pyenv-virtualenv&#xff0c;可以按照以下步骤进行操作&#xff1a; ps: centos7 最高适配到3.9.* 步骤 1&#xff1a;安装依赖 首先&#xff0c;确保你的系统中安装了必需的依赖项。你可以使用以下命令安装它们&#xff1a; [root ~]# yum gro…...

C++:类与对象,定义类和构造函数

#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> using namespace std; //如何让定义一个类 // 封装 // 1、将数据和方法定义到一起。 // 2、把想给你看的数据给你看&#xff0c;不想给你看的封装起来。 通过访问限定符来实现 class Stack { public: //1.成…...

【Java消息队列】应对消息丢失、重复、顺序与积压的全面策略

应对消息丢失、重复、顺序与积压的全面策略 引言kafka消息丢失生产者消费者重复消费顺序消费消息积压生产者消费者其他RabbitMQ消息丢失生产者事务机制,保证生产者发送消息到 RabbitMQ Server发送方确认机制,保证消息能从交换机路由到指定队列保证消息在 RabbitMQ Server 中的…...

解锁机器学习核心算法|神经网络:AI 领域的 “超级引擎”

一、神经网络&#xff1a;AI 领域的 “超级引擎” 在机器学习的庞大算法体系中&#xff0c;有十种算法被广泛认为是最具代表性和实用性的&#xff0c;它们犹如机器学习领域的 “十大神器”&#xff0c;各自发挥着独特的作用。这十大算法包括线性回归、逻辑回归、决策树、随机森…...

Android14(13)添加墨水屏手写API

软件平台&#xff1a;Android14 硬件平台&#xff1a;QCS6115 需求&#xff1a;特殊品类的产品墨水屏实现手写的功能&#xff0c;本来Android自带的Input这一套可以实现实时展示笔迹&#xff0c;但是由于墨水屏特性&#xff0c;达不到正常的彩屏刷新的帧率&#xff0c;因此使用…...

flyway的ignoreMigrationPatterns

1、概述 ignoreMigrationPatterns 是 Flyway 中的一个配置选项&#xff0c;用于指定在迁移过程中可以忽略的迁移脚本的模式。这个选项通常用于在特定情况下跳过某些迁移脚本的执行&#xff0c;例如在开发环境中跳过某些测试数据脚本&#xff0c;或者在特定条件下忽略某些已经不…...

25年2月通信基础知识补充:多普勒频移与多普勒扩展、3GPP TDL信道模型

看文献过程中不断发现有太多不懂的基础知识&#xff0c;故长期更新这类blog不断补充在这过程中学到的知识。由于这些内容与我的研究方向并不一定强相关&#xff0c;故记录不会很深入请见谅。 【通信基础知识补充7】25年2月通信基础知识补充1 一、多普勒频移与多普勒扩展傻傻分不…...

华为动态路由-OSPF-骨干区

华为动态路由-OSPF-骨干区 一、OSPF简介 1、OSPF概述 OSPF是一种开放式的、基于链路状态的内部网关协议&#xff08;IGP&#xff09;&#xff0c;用于在自治系统内部进行路由选择和通信。 OSPF是互联网工程任务组&#xff08;IETF&#xff09;定义的标准之一&#xff0c;被广…...

接口测试-API测试中常用的协议(中)

一、SOAP SOAP&#xff08;Simple Object Access Protocol&#xff09;即简单对象访问协议&#xff0c;是一种基于 XML 的用于在网络中交换结构化信息的协议&#xff0c;常用于 Web 服务之间的通信。以下为你详细介绍&#xff1a; 产生背景 在互联网发展过程中&#xff0c;需…...

植物大战僵尸杂交版v3.2.1最新版本(附下载链接)

B站游戏作者潜艇伟伟迷于12月21日更新了植物大战僵尸杂交版3.2.1版本&#xff01;&#xff01;&#xff01;&#xff0c;有b站账户的记得要给作者三连关注一下呀&#xff01; 不多废话下载链接放上&#xff1a; 夸克网盘链接&#xff1a;&#xff1a;https://pan.quark.cn/s/e5…...

java每日精进 2.20 MQ相关复健

在 RabbitMQ 中&#xff0c;消息消费者对消息的签收&#xff08;acknowledgment&#xff09;可以通过三种方式进行管理&#xff1a;自动签收、手动签收 和 拒绝签收。它们主要控制消费者如何处理消息确认和消息的重新排队。下面详细讲解它们的区别&#xff0c;并通过代码示例展…...

【设计模式精讲】结构型模式之代理模式(静态代理、JDK动态代理、cglib动态代理)

文章目录 第五章 结构型模式5.1 代理模式5.1.1 代理模式介绍5.1.2 代理模式原理5.1.3 静态代理实现5.1.4 JDK动态代理5.1.4.1 JDK动态代理实现5.1.4.2 类是如何动态生成的5.1.4.3 代理类的调用过程 5.1.5 cglib动态代理5.1.5.1 cglib动态代理实现5.1.5.2 cglib代理流程 5.1.6 代…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...