初识 Floodfall 算法
文章目录
- **一、Floodfall 算法的概述**
- **二、深度优先搜索(DFS)和广度优先搜索(BFS)在 Floodfall 算法中的应用**
- **三、算法的基本原理**
- **四、应用场景**
一、Floodfall 算法的概述
Floodfall 算法通常用于解决与区域填充、图的遍历等相关的问题。它的中文名字:洪水灌溉,顾名思义它的核心思想是从一个起始点开始,像洪水一样蔓延,直到满足特定的条件或覆盖整个目标区域。
Floodfall 算法在实现过程中,常常会基于深度优先搜索(DFS)和广度优先搜索(BFS)的思想。
二、深度优先搜索(DFS)和广度优先搜索(BFS)在 Floodfall 算法中的应用
深度优先搜索(DFS)在 Floodfall 算法中,会沿着一条路径尽可能深地探索下去,直到无法继续,然后回溯。这种方式在某些情况下能够快速找到较深的区域,但可能会忽略一些较近但隐藏较深的区域。
例如,在一个迷宫中,如果使用 DFS 进行 Floodfall 式的探索,可能会先深入一条复杂的长通道,而错过一些就在入口附近但需要绕一点路才能到达的区域。
广度优先搜索(BFS)则是逐层地向外扩展,先访问距离起始点近的节点,再逐步扩展到更远的节点。在 Floodfall 算法中,BFS 能确保先填充距离起始点较近的区域,填充的顺序更加有序和可预测。
比如在地图填充中,使用 BFS 进行 Floodfall 操作,会先填充起始点周围的区域,再逐渐向外扩散。
三、算法的基本原理
Floodfall 算法一般会使用某种数据结构(如队列或栈)来存储待处理的节点。从起始节点出发,将其相邻的未访问节点加入数据结构,然后依次处理这些节点,不断扩展填充区域。
四、应用场景
- 图像处理中的颜色填充。
- 游戏地图中的区域探索。
下面是一个使用 C++实现的简单 Floodfall 算法示例代码,用于填充二维矩阵中的一个区域,分别展示了基于 DFS 和 BFS 的实现方式:
#include <iostream>
#include <stack>
#include <queue>// 定义矩阵的大小
const int ROWS = 10;
const int COLS = 10;// 方向数组,用于遍历相邻节点
const int dx[] = { -1, 1, 0, 0 };
const int dy[] = { 0, 0, -1, 1 };// 定义一个结构体来表示节点
struct Node {int x;int y;
};// 基于 DFS 的 FloodFill 函数
void floodFillDFS(int grid[ROWS][COLS], int startX, int startY, int targetColor, int newColor) {std::stack<Node> s;Node start;start.x = startX;start.y = startY;s.push(start);while (!s.empty()) {Node curr = s.top();s.pop();int x = curr.x;int y = curr.y;// 如果当前节点的颜色与目标颜色不同,跳过if (grid[x][y]!= targetColor) {continue;}// 更改颜色grid[x][y] = newColor;// 遍历相邻节点for (int i = 0; i < 4; i++) {int newX = x + dx[i];int newY = y + dy[i];// 检查边界if (newX >= 0 && newX < ROWS && newY >= 0 && newY < COLS) {Node next;next.x = newX;next.y = newY;s.push(next);}}}
}// 基于 BFS 的 FloodFill 函数
void floodFillBFS(int grid[ROWS][COLS], int startX, int startY, int targetColor, int newColor) {std::queue<Node> q;Node start;start.x = startX;start.y = startY;q.push(start);while (!q.empty()) {Node curr = q.front();q.pop();int x = curr.x;int y = curr.y;// 如果当前节点的颜色与目标颜色不同,跳过if (grid[x][y]!= targetColor) {continue;}// 更改颜色grid[x][y] = newColor;// 遍历相邻节点for (int i = 0; i < 4; i++) {int newX = x + dx[i];int newY = y + dy[i];// 检查边界if (newX >= 0 && newX < ROWS && newY >= 0 && newY < COLS) {Node next;next.x = newX;next.y = newY;q.push(next);}}}
}// 打印矩阵
void printGrid(int grid[ROWS][COLS]) {for (int i = 0; i < ROWS; i++) {for (int j = 0; j < COLS; j++) {std::cout << grid[i][j] << " ";}std::cout << std::endl;}
}int main() {int grid[ROWS][COLS] = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 1, 1, 1, 1, 1, 1, 1, 1, 0},{0, 1, 0, 0, 0, 0, 0, 0, 1, 0},{0, 1, 0, 1, 1, 1, 1, 0, 1, 0},{0, 1, 0, 1, 0, 0, 1, 0, 1, 0},{0, 1, 0, 1, 0, 0, 1, 0, 1, 0},{0, 1, 0, 1, 1, 1, 1, 0, 1, 0},{0, 1, 0, 0, 0, 0, 0, 0, 1, 0},{0, 1, 1, 1, 1, 1, 1, 1, 1, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};std::cout << "原始矩阵:" << std::endl;printGrid(grid);std::cout << "基于 DFS 填充后的矩阵:" << std::endl;floodFillDFS(grid, 1, 1, 1, 2);printGrid(grid);std::cout << "基于 BFS 填充后的矩阵:" << std::endl;floodFillBFS(grid, 1, 1, 2, 3);printGrid(grid);return 0;
}
在上述代码中,我们分别实现了基于 DFS 和 BFS 的 Floodfall 算法,用于填充二维矩阵中的指定区域。
相关文章:
初识 Floodfall 算法
文章目录 **一、Floodfall 算法的概述****二、深度优先搜索(DFS)和广度优先搜索(BFS)在 Floodfall 算法中的应用****三、算法的基本原理****四、应用场景** 一、Floodfall 算法的概述 Floodfall 算法通常用于解决与区域填充、图的…...

[Linux] LVM挂载的硬盘重启就掉的问题解决
问题:系统重启后挂在逻辑卷的盘会掉(必现) 环境:SUSE Linux 11 SP4 原因:boot.lvm是关闭的 解决:boot.lvm设置开启 参考资料: linux下lvm状态Not avaliable问题排查及处理(常见Suse操作系统…...
YOLOv8改进 | 主干网络 | 用EfficientNet卷积替换backbone【教程+代码 】
秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录 :《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有80+篇内容,内含各种Head检测头、损失函数Loss、…...

数据库规范化设计 5大基本原则
规范化设计原则是数据库设计的基本原则,有助于减少数据冗余,提高数据一致性和完整性,简化数据管理,增强数据安全性,对整个开发项目至关重要。而缺乏规范化设计会导致数据冗余,增加存储成本,引发…...

【nginx】解决k8s中部署nginx转发不会自动更新域名解析启动失败的问题
文章目录 1. 问题2.解决办法3.扩展说明3.1 DNS解析阶段划分3.2 问题说明3.2.1 先看/etc/resolv.conf说明3.2.2 针对第一个问题3.2.3 针对第二个问题 【后端】NginxluaOpenResty高性能实践 参考: https://blog.csdn.net/u010837612/article/details/123275026 1. 问…...
LeetCode637 二叉树的层平均值
前言 题目: 637. 二叉树的层平均值 文档: 代码随想录——二叉树的层平均值 编程语言: C 解题状态: 求取平均值的时候出现了点问题 思路 C中,浮点数的相加会产生精度误差,求取平均值时最好只在最后一步进行…...

王学岗ASM
服务发现 package com.example.testasm;import android.content.Context; import android.os.Bundle;import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat;…...

【数据结构】—— 队列
1、队列的概念2、队列的结构如何选择合适的数据结构实现队列(数组or链表) 3、队列的链式存储3.1 队列的链式存储结构3.2 队列的常见接口3.3 队列的接口实现初始化判空入队列出队列获取队头元素获取队尾元素获取节点个数销毁 3.4 源代码 4、队列的顺序存储…...

vue中openlayers过滤高亮显示某个图层
vue中openlayers过滤高亮显示某个图层 openlayers库没有直接支持这样设置,所以可以使用库:ol-ext,地址:https://viglino.github.io/ol-ext/examples/filter/map.filter.crop.html 效果: 关键代码: /**…...

WPF篇(11)-ToolTip控件(提示工具)+Popup弹出窗口
ToolTip控件 ToolTip控件继承于ContentControl,它不能有逻辑或视觉父级,意思是说它不能以控件的形式实例化,它必须依附于某个控件。因为它的功能被设计成提示信息,当鼠标移动到某个控件上方时,悬停一会儿,…...

【mysql 第一篇章】系统和数据库的交互方法
一、宏观的查看系统怎么和数据库交互 在我们刚刚接触系统和数据库的时候不明白其中的原理,只知道系统和数据库是需要交互的。所以我们会理解成上图的形式。 二、MYSQL 驱动 随着我们的学习时间的加长以及对程序的了解,发现链接数据库是需要有别的工具辅…...
数据结构-位运算总结
位运算总结: 1.求位1的个数 191. 位1的个数 - 力扣(LeetCode) 有两种写法: 1.是把该数不断的去与0x1相与,得到该数的最后一位的值,然后判断他是不是1,再把该数更新一下整体往后移动一位也就…...
java 异常堆栈的由来
编写的程序代码内部错误产生的异常,如调用对象为空(空指针异常)、数组越界异常、除0异常等。这种通常称为未检查的异常(Runtime异常子类),在虚拟机中执行时会集中处理这些异常。其他运行中异常,通过throw语句主动抛出的…...

【推荐系统】【多任务学习】Progressive Layered Extraction (PLE)
Progressive Layered Extraction (PLE): A Novel Multi-Task Learning (MTL) Model for Personalized Recommendations 文章目录 Progressive Layered Extraction (PLE): A Novel Multi-Task Learning (MTL) Model for Personalized Recommendations1 论文出处2 背景2.1 背景介…...
java -转win32/win64免安装jre环境运行
由于java 转为exe,只能在装有JDK环境的电脑运行, 发给其他人也不能运行,缺少环境,程序自己背着jre走 1.先打好jar 包 2.使用exe4j 把jar包转成exe 运行程序 3.使用inno stup ,把exe运行程序加上jre环境 以下是具体实现…...
算法板子:容斥原理——求出 1∼n 中能被质数 p1,p2,…,pm 中的至少一个数整除的整数有多少个
1. 题目要点 1. 设:求1~10中能被质数2和3中至少一个数整除的数有多少个。1~10中能被质数2整除的数的集合记为S1{2,4,6,8,10},能被质数3整除的数的集合记为S2{3,6,9},能同时被质数2和3整数的数的集合为S1∩S2{6} 2. 这道题的目的是求S1∪S2∪S…...
用gurobipy求解带不等式约束条件的优化问题
1. 引入 在当今的数据驱动世界中,优化问题无处不在,从工程设计到经济模型,再到机器学习算法的调参,优化都是实现效率最大化、成本最小化或性能最优化的关键工具。 这里有一个典型的数学优化问题,目标是在给定的约束条…...

漏洞复现-Adobe ColdFusion 远程代码执行漏洞(CVE-2023-38203)
1.漏洞描述 Adobe ColdFusion是一种服务器端的Web应用开发平台。它由Adobe Systems开发,用于创建动态的、交互式的Web应用程序和网站。 Adobe ColdFusion在2018u17及之前版本、2021u7及之前版本和2023u1及之前版本中存在任意代码执行漏洞。该漏洞是由于反序列化不…...

Spring-MyBatis整合:No qualifying bean of type ‘XXX‘ available: ...
1.看一下核心配置中有没有导入myBatis配置 2.看一下service和dao有没有相应注解 3.看一下MyBatisConfig中有没有对sqlSessionFactory和mapperScannerConfigurer注释成bean对象以及有没有配置映射文件路径...

gitea docker 快捷安装部署
前言 在前一篇博文(什么是 Gitea?)中,我们详细介绍了gitea的功能特性,以及其与其它git服务器之间的特性多维度对比。 在本文中,我们将详细介绍gitea的快捷安装部署,docker方式! 1…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...