一“填”到底:深入理解Flood Fill算法

✨✨✨学习的道路很枯燥,希望我们能并肩走下来!

文章目录

目录

文章目录

前言

一  floodfill算法是什么?

二  相关OJ题练习

2.1  图像渲染 

 2.2  岛屿数量

 2.3  岛屿的最大面积

2.4   被围绕的区域

 2.5  太平洋大西洋水流问题

 2.6  扫雷游戏

 2.7  衣橱整理(原:面试题 13. 机器人的运动范围 )

总结


前言

本篇详细介绍了进一步介绍floodfill算法,让使用者对floodfill算法有更加深刻的认知,而不是仅仅停留在表面,更好的模拟,为了更好的使用. 文章可能出现错误,如有请在评论区指正,让我们一起交流,共同进步!


一  floodfill算法是什么?

洪水填充(也称为种子填充)是一种算法,用于确定连接到多维数组中给定节点的区域。

可以用dfs或者bfs来作为基础,我们这里用DFS

 floodfill的本质是搜索找到性质相同的一个连通块(区域)

二  相关OJ题练习

2.1  图像渲染 

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

 

class Solution {int dx[4] = {1,-1,0,0};int dy[4] = {0,0,1,-1};int m,n,prev;
public:vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {if(image[sr][sc] == color)  return image;prev = image[sr][sc];m = image.size(),n = image[0].size();dfs(image,sr,sc,color);return image;}void dfs(vector<vector<int>>& image, int i, int j, int color){image[i][j] = color;for(int k = 0; k < 4;k++){int x = i + dx[k], y = j + dy[k];if(x >=0 && x < m && y >= 0 && y < n && image[x][y] == prev){dfs(image,x,y,color);}}}
};

 2.2  岛屿数量

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

 

class Solution {int dx[4] = {0,0,1,-1};int dy[4] = {1,-1,0,0};int ret,m,n;bool vis[301][301];
public:int numIslands(vector<vector<char>>& 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]){dfs(grid,i,j);ret++;}}}return ret;}void dfs(vector<vector<char>>& grid,int i,int j){vis[i][j] = true;for(int k = 0;k<4;k++){int x = i + dx[k], y = j + dy[k];if(x >=0 && x < m && y >= 0 && y < n && grid[x][y] == '1' && !vis[x][y]){vis[x][y] = true;dfs(grid,x,y);}}}
};

 2.3  岛屿的最大面积

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

class Solution {int dx[4] = {0,0,1,-1};int dy[4] = {1,-1,0,0};int ret,m,n,count;bool vis[51][51];
public: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]){dfs(grid,i,j);ret = max(ret,count);count = 0;}}}return ret;}void dfs(vector<vector<int>>& grid,int i,int j){count++;vis[i][j] = true;for(int k = 0;k<4;k++){int x = i + dx[k], y = j + dy[k];if(x >=0 && x < m && y >= 0 && y < n && grid[x][y] == 1 && !vis[x][y]){dfs(grid,x,y);}}}
};

2.4   被围绕的区域

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

 逆转思维,直接从边界进行DFS,将符合条件的改成‘.’,在遍历一遍

class Solution {int dx[4] = {1,-1,0,0};int dy[4] = {0,0,-1,1};int m,n;
public: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')  dfs(board,0,j);if(board[m-1][j] == 'O')    dfs(board,m-1,j);}for(int i = 0;i<m;i++){if(board[i][0] == 'O')  dfs(board,i,0);if(board[i][n-1] == 'O')   dfs(board,i,n-1);}for(int i = 0;i<m;i++)for(int j = 0;j<n;j++){cout<<board[i][j]<<" ";if(board[i][j] == '.')  board[i][j] = 'O';else if(board[i][j] == 'O') board[i][j] = 'X';}}void dfs(vector<vector<char>>& board,int i,int j){board[i][j] = '.';for(int k = 0; k < 4; k++){int x = i + dx[k], y = j + dy[k];if(x >=0 && x < m && y >= 0 && y < n && board[x][y] == 'O'){dfs(board,x,y);}}}
};

 2.5  太平洋大西洋水流问题

417. 太平洋大西洋水流问题 - 力扣(LeetCode)

 

class Solution {int dx[4] = {1,-1,0,0};int dy[4] = {0,0,1,-1};vector<vector<int>> ret;int m,n;
public:vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {m = heights.size(),n = heights[0].size();vector<vector<bool>> visP(m,vector<bool>(n));vector<vector<bool>> visA(m,vector<bool>(n));for(int j = 0; j < n ;j++){dfs(heights,0,j,visP);dfs(heights,m-1,j,visA);}for(int i = 0; i < m; i++){dfs(heights,i,0,visP);dfs(heights,i,n-1,visA);}for(int i = 0;i < m; i++)for(int j = 0; j < n; j++){if(visP[i][j] && visA[i][j]){ret.push_back({i,j});}}return ret;}void dfs(vector<vector<int>>& heights,int i, int j,vector<vector<bool>>& vis){vis[i][j] = true;for(int k = 0; k < 4; k++){int x = i + dx[k], y = j + dy[k];if(x >=0 && x < m && y >= 0 && y < n && heights[x][y] >= heights[i][j] && !vis[x][y]){dfs(heights,x,y,vis);}}}
};

 2.6  扫雷游戏

529. 扫雷游戏 - 力扣(LeetCode)

class Solution {int dx[8] = {1,-1,0,0,1,1,-1,-1};int dy[8] = {0,0,1,-1,1,-1,1,-1};int m,n;
public:vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click){if(board[click[0]][click[1]] == 'M'){board[click[0]][click[1]] = 'X';return board;}m = board.size(),n = board[0].size();dfs(board,click[0],click[1]);return board;}void dfs(vector<vector<char>>& board,int i,int j){int count = 0;for(int k = 0; k < 8; k++){int x = i + dx[k], y = j + dy[k];if(x >=0 && x < m && y >= 0 && y < n && board[x][y] == 'M'){count++;}}if(count)  //周围有地雷{board[i][j] = count + '0';return;}else  //周围没地雷{board[i][j] = 'B';for(int k = 0; k < 8; k++){int x = i + dx[k], y = j + dy[k];if(x >=0 && x < m && y >= 0 && y < n && board[x][y] == 'E'){dfs(board,x,y);}}}}
};

 2.7  衣橱整理(原:面试题 13. 机器人的运动范围

LCR 130. 衣橱整理 - 力扣(LeetCode)

class Solution {int ret;bool vis[101][101];int dx[4] = {0,0,1,-1};int dy[4] = {1,-1,0,0};int _m,_n,_cnt;
public:int wardrobeFinishing(int m, int n, int cnt) {_m = m,_n = n, _cnt = cnt;dfs(0,0);return ret;}void dfs(int i,int j){ret++;vis[i][j] = true;for(int k = 0; k < 4; k++){int x = i + dx[k], y = j + dy[k];if(x >=0 && x < _m && y >= 0 && y < _n && !vis[x][y] && check(x,y)){dfs(x,y);}}}bool check(int i,int j){int tmp = 0;while(i){tmp += i % 10;i /= 10;}while(j){tmp += j % 10;j /= 10;}return tmp <= _cnt;}
};

总结

✨✨✨各位读友,本篇分享到内容是否更好的让你理解floodfill算法,如果对你有帮助给个👍赞鼓励一下吧!!
🎉🎉🎉世上没有绝望的处境,只有对处境绝望的人。
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Fastjson反序列化

Fastjson反序列化一共有三条利用链 TempLatesImpl&#xff1a;实战中不适用JdbcRowSetImpl&#xff1a;实际运用中较为广泛BasicDataSource&#xff08;BCEL&#xff09; 反序列化核心 反序列化是通过字符串或字节流&#xff0c;利用Java的反射机制重构一个对象。主要有两种…

C语言复习概要(二)

本文目录 C语言中的数组与函数详解1. 引言2. 数组2.1. 什么是数组&#xff1f;语法&#xff1a;示例&#xff1a; 2.2. 数组的初始化示例 1&#xff1a;在声明时初始化示例 2&#xff1a;部分初始化示例 3&#xff1a;运行时赋值 2.3. 数组的访问与修改示例&#xff1a; 2.4. 多…

vite学习教程02、vite+vue2配置环境变量

文章目录 前言1、安装依赖2、配置环境变量3、应用环境变量4、运行和构建项目资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝3W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技术内容&#xff1…

vite学习教程04、vue集成axios封装request工具类及应用

文章目录 前言1、安装axios2、封装request工具类3、封装api请求工具4、实战&#xff1a;vue中使用api请求工具类资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝3W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技…

YOLO--前置基础词-学习总结

RFBNet是什么意思 RFBNet 是一种用于目标检测的深度学习网络&#xff0c;它的名字来源于 "Receptive Field Block Network"&#xff08;感受野块网络&#xff09;。简单来说&#xff0c;RFBNet 是一种可以让计算机更好地“看”图像中不同大小的物体的方法。 在图像处…

51单片机的家用煤气报警系统【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温度传感器CO传感器蓝牙LED、蜂鸣器等模块构成。适用于家用天然气泄露报警器、煤气泄露报警器、无线报警等相似项目。 可实现功能: 1、LCD1602实时显示温度和煤气浓度 2、温度传感器DS18B20采集环境温度 3、CO传…

图解大模型计算加速系列:vLLM源码解析3,Prefix Caching

【全文目录如下】 一、两种不同的BlockAllocator 二、物理块和逻辑块的结构 三、prefill阶段的物理块分配方法 3.1 allocate函数入口 3.2 计算物理块hash值的方法 3.3 使用LRUEvictor管理物理块分配细节 3.4 再探LRUEvictor&#xff0c;理解“prefix” …

在线点餐堂食系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;商品管理&#xff0c;基础数据管理&#xff0c;论坛管理&#xff0c;公告信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;商品&#xff0c;…

Stable Diffusion绘画 | 插件-Deforum:场景穿越视频

第1步&#xff1a;在 Deforum 的「运行」模块&#xff0c;调整宽高&#xff0c;保持与图片一致&#xff1a; 第2步&#xff1a;在「关键帧」模块&#xff0c;勾选☑️「启用图像引导模式」&#xff0c;引导图像中&#xff0c;填写对应的图片路径&#xff0c;其他参数设置如下图…

开放式耳机哪个品牌好?适合运动的开放式蓝牙耳机分享

如今&#xff0c;开放式耳机的购买量呈现出持续上升的趋势&#xff0c;变得越来越多。而随着人们对音频设备需求的不断提升以及对舒适佩戴体验和自然聆听感受的日益追求&#xff0c;开放式耳机也以其独特的优势逐渐走进大众的视野&#xff0c;成为众多消费者的新宠。 在各大电…

工程活凝胶是什么?由啥组成?有啥用?

大家好&#xff01;今天我们来了解一篇《Engineered Living Hydrogels》发表于《Advanced Materials》的研究。工程活凝胶作为一种新型生物系统&#xff0c;融合了活微生物细胞和水凝胶基质的优势。它的出现得益于微生物细胞工程和材料制造的创新。这种材料在多个领域展现出巨大…

Python调试技巧:高效定位与修复问题

Python调试技巧&#xff1a;高效定位与修复问题 在Python编程过程中&#xff0c;调试是不可避免的重要环节。无论是刚接触编程的初学者还是经验丰富的开发者&#xff0c;都可能会遇到代码运行不符合预期的情况。高效的调试技巧不仅能帮助我们快速找到问题&#xff0c;还能减少…

基于微信小程序的调查问卷管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

2024年【浙江省安全员-C证】考试资料及浙江省安全员-C证找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【浙江省安全员-C证】考试资料及浙江省安全员-C证找解析&#xff0c;包含浙江省安全员-C证考试资料答案和解析及浙江省安全员-C证找解析练习。安全生产模拟考试一点通结合国家浙江省安全员-C证考试最新大纲及浙…

C语言自定义类型:联合和枚举

1.联合体 1.1联合体类型的声明 联合体由一个或者多个成员构成&#xff0c;这些成员可以不同的类型。但是编译器只为最大的成员分配足够的内存空间&#xff0c;联合体的特点是所有成员共用同一块空间&#xff0c;所以联合体也叫共用体 给联合体其中一个成员赋值&#xff0c;其…

华为OD机试 - 最长的密码(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

将 LabelMe 标签转换为 YOLO 标签

将 LabelMe 标签转换为 YOLO 标签 在机器学习工作流程中&#xff0c;数据处理是一个关键步骤。通常我们会使用不同的工具来标注数据&#xff0c;而每种工具都有其特定的格式。在这篇文章中&#xff0c;我们将介绍如何将 LabelMe 标注的数据转换为 YOLO 格式&#xff0c;以便在…

IntelliJ IDEA 2024.2 新特性概览

文章目录 1、重点特性:1.1 改进的 Spring Data JPA 支持1.2 改进的 cron 表达式支持1.3 使用 GraalJS 作为 HTTP 客户端的执行引擎1.4 更快的编码时间1.5 K2 模式下的 Kotlin 性能和稳定性改进 2、用户体验2.1 改进的全行代码补全2.2 新 UI 成为所有用户的默认界面2.3 Search E…

Java开发必知必会的一些工具

本文主要介绍 Java 程序员应该学习的一些基本和高级工具。 如果你想成为一名更好的程序员&#xff0c;最重要的技巧之一就是学习你的编程工具。 Java 世界中存在着如此多的工具&#xff0c;从 Eclipse、NetBeans 和 IntelliJ IDEA 等著名的 IDE 到 JConsole、VisualVM、Eclipse…

学术环境中能力对敏捷努力评估的影响

论文标题&#xff1a;Impact of competence on agile effort estimation in academic setting 作者信息&#xff1a; Luka FrstTomaž HoveljaMarko PoženelDamjan Vavpotǐc 均来自斯洛文尼亚卢布尔雅那大学计算机与信息科学学院。 论文出处&#xff1a;发表于《Software…