【算法】BFS-解决FloodFill问题

目录

FloodFill问题

图像渲染

岛屿数量

岛屿的最大面积

被围绕的区域


FloodFill问题

FloodFill就是洪水灌溉的意思,假设有下面的一块田地,负数代表是凹地,正数代表是凸地,数字的大小表示凹或者凸的程度。现在下一场大雨,请问大雨下完,这块田地会有几处积水

会发现会有3处积水,FloodFill问题的本质就是找到性质相同的连通块。所以可以使用dfs或者bfs解决。使用两种算法的原理是相同的,只是实现方法不同。

图像渲染

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

从给定的点开始宽搜,将周围等于给定的点的颜色全都改成目标颜色即可

class Solution {
public:vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {int m = image.size(), n = image[0].size();vector<vector<int>> v(m, vector<int>(n, 0));queue<pair<int, int>> q;q.push({sr, sc});v[sr][sc] = 1;int flag = image[sr][sc];int dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, -1, 1};while(!q.empty()){int x = q.front().first, y = q.front().second;q.pop();image[x][y] = color;for(int i = 0;i < 4;i ++){int a = x + dx[i], b = y + dy[i];if(a >= 0 && a < m && b >= 0 && b < n && image[a][b] == flag && v[a][b] == 0) {q.push({a, b});v[a][b] = 1;}}}return image;}
};

并且要注意数组全是0,且flag也是0的情况,所以添加一个标记数组。不让一个元素重复放进队列 

岛屿数量

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

直接遍历一下二维数组,当遇到1时,就使用bfs将这个岛屿全部变成0,然后继续向后遍历二维数组,等到遍历完后,进行了几次bfs就有几个岛屿

class Solution {
public:int numIslands(vector<vector<char>>& grid) {int m = grid.size(), n = grid[0].size(), ans = 0;for(int i = 0;i < m;i ++)for(int j = 0;j < n;j ++)if(grid[i][j] == '1'){ans ++;bfs(grid, i, j, m, n);}return ans;}void bfs(vector<vector<char>>& grid, int x, int y, int m, int n){queue<pair<int, int>> q;int dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, -1, 1};q.push({x, y});grid[x][y] = '0';while(!q.empty()){auto t = q.front();q.pop();for(int i = 0;i < 4;i ++){int a = t.first + dx[i], b = t.second + dy[i];if(a >= 0 && a < m && b >= 0 && b < n && grid[a][b] == '1'){q.push({a, b});grid[a][b] = '0';}}}}
};

岛屿的最大面积

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

直接遍历二维数组,当遇到1时,也就是遇到岛屿时,直接使用bfs将这个岛屿全部变成0,并在这期间计算出这个岛屿的面积,也就是每向队列中放入一个数据就++,然后最后返回,与答案比较

class Solution {
public:int maxAreaOfIsland(vector<vector<int>>& grid) {int m = grid.size(), n = grid[0].size(), ans = 0;for(int i = 0;i < m;i ++)for(int j = 0;j < n;j ++)if(grid[i][j] == 1)ans = max(ans, dfs(grid, m, n, i, j));return ans;}int dfs(vector<vector<int>>& grid, int m, int n, int x, int y){queue<pair<int, int>> q;q.push({x, y});grid[x][y] = 0;int sum = 1;int dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, -1, 1};while(!q.empty()){auto t = q.front();q.pop();for(int i = 0;i < 4;i ++){int a = t.first + dx[i], b = t.second + dy[i];if(a >= 0 && a < m && b >= 0 && b < n && grid[a][b] == 1){q.push({a, b});grid[a][b] = 0;sum ++;}}}return sum;}
};

被围绕的区域

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

这道题的重点是边缘的O是不算被X围绕的,而我们要找的是一个O的连通块,并且这个连通块里面全部的O都要被X围绕。所以,我们可以将与边缘的O连通的块排除,剩下的就都是被包围的

class Solution {
public:void solve(vector<vector<char>>& board) {// 遍历边界,若边界上的是O,则进行宽搜,将与这个O相连的所有O标记,被标记的O不会被变成Xint m = board.size(), n = board[0].size();vector<vector<int>> flag(m, vector<int>(n, 0));// 第一行for(int i = 0;i < n;i ++)if(board[0][i] == 'O')bfs(board, flag, m, n, 0, i);// 最后一行for(int i = 0;i < n;i ++)if(board[m - 1][i] == 'O')bfs(board, flag, m, n, m - 1, i);// 第一列for(int i = 1;i < m - 1;i ++)if(board[i][0] == 'O')bfs(board, flag, m, n, i, 0);// 最后一列for(int i = 1;i < m - 1;i ++)if(board[i][n - 1] == 'O')bfs(board, flag, m, n, i, n - 1);// 遍历一遍数组,当字符是O,并且flag数组中是0,说明这个是被X包含的for(int i = 0;i < m;i ++)   for(int j = 0;j < n;j ++)if(board[i][j] == 'O' && flag[i][j] == 0) board[i][j] = 'X';}void bfs(vector<vector<char>>& board, vector<vector<int>>& flag, int m, int n, int x, int y){queue<pair<int, int>> q;q.push({x, y});flag[x][y] = 1;int dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, -1, 1};while(!q.empty()){auto t = q.front();q.pop();for(int i = 0;i < 4;i ++){int a = t.first + dx[i], b = t.second + dy[i];if(a >= 0 && a < m && b >= 0 && b < n && board[a][b] == 'O' && flag[a][b] == 0){q.push({a, b});flag[a][b] = 1;}}}}
};

要注意board数组全是O的情况,所以只有当标记数组为0才放进队列当中。不让一个元素重复放入队列

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

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

相关文章

代码随想录算法训练营第三十七天|动态规划part4

1049. 最后一块石头的重量 II 题目链接&#xff1a; 1049. 最后一块石头的重量 II - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a; 代码随想录 思路&#xff1a; 理解为把石头分成两堆 使得两堆的差值尽可能小 求这个最小值1 理解为往背包里装物品 每个物品的…

(八)深入了解AVFoundation-采集:拍照功能的实现

引言 在上一篇文章中&#xff0c;我们初步完成了使用 AVFoundation 采集视频数据的流程&#xff0c;掌握了 AVCaptureSession 的搭建与视频流的预览显示。 本篇将继续深入 AVFoundation&#xff0c;聚焦于静态图片采集的实现。通过 AVCapturePhotoOutput&#xff0c;我们可以…

git tag使用场景和实践

背景 每次上线一个迭代&#xff0c;为了区分本次代码的分支是哪个迭代的commit&#xff0c;可以给分支打上tag&#xff0c;这样利于追踪分支所属迭代&#xff0c;如果devops没有自动给分支打tag&#xff0c;需要自己来打 操作 1.查看当前tag git tag2.给分支打tag git tag…

从零开始掌握Linux数据流:管道与重定向完全指南

全文目录 1 知识背景与核心概念1.1 操作系统的输入输出模型1.2 Shell 的中间人角色 2 重定向技术深度解析2.1 输出重定向2.1.1 覆盖写2.1.2 追加写2.1.3 错误重定向2.1.4 同时重定向 stdout 和 stderr 2.2 输入重定向2.2.1 文件作为输入源2.2.2 Here Document&#xff08;多行输…

aws(学习笔记第三十九课) iot-core

文章目录 aws(学习笔记第三十九课) iotcore(Internet Of Thing)学习内容:1. 整体架构1.1 代码链接1.2 整体架构(概要)1.3 整体架构(详细 )2. 代码解析2.1 创建`IOT thing`2.2 创建`AWS IOT certificate`证书2.2.1 创建`lambda`需要的`role`2.2.2 创建`lambda`2.2.3 `lambd…

国家新政鼓励游戏出海,全球化安全威胁如何解

本文作者&#xff1a;腾讯宙斯盾DDoS防护团队 01 政策红利释放&#xff1a;游戏出海升级为“国家战略工程” 01 4月21日&#xff0c;国务院新闻办公室发布《加快推进服务业扩大开放综合试点工作方案》&#xff0c;释放了一个信号&#xff1a;首次将“游戏出海”列为战略级工程&…

MobX 在 React 中的使用:状态管理的新选择

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

Idea 配置 Git

1、下载Git 下载地址&#xff1a; Git - Downloading Package 2、win 打开 git bash &#xff0c;配置邮箱和用户名 //配置邮箱 git config --global user.email "710419844qq.com" //配置全局用户名 git config --global user.name "smelodys" 3、ide…

Vue3 + OpenLayers 开发教程 (四) 样式配置与性能优化

1. 地图样式基础概念 1.1 什么是地图样式&#xff1f; 地图样式是决定地图要素&#xff08;点、线、面&#xff09;如何显示的重要配置。在 OpenLayers 中&#xff0c;样式主要包含以下几个核心组件&#xff1a; Fill&#xff08;填充&#xff09;&#xff1a;控制面状要素的…

【Nacos-安全与限流机制健全06 】

文章目录 Nacos安全机制介绍Nacos代码实现Nacos限流机制Nacos限流的代码实现 Nacos安全机制介绍 一、Nacos安全控制机制 Nacos 提供了多种安全控制机制&#xff0c;以保证服务和配置的访问安全&#xff1a; 身份验证 (Authentication) Nacos 支持用户身份验证来防止未授权的访…

自建开源远程协助服务RustDesk —— 筑梦之路

开源项目 # 服务端https://github.com/rustdesk/rustdesk-server.git# 客户端https://github.com/rustdesk/rustdesk.git 搭建服务端 需要使用的端口、协议 hbbs - RustDesk ID 注册服务器 hbbr - RustDesk 中继服务器默认情况下&#xff0c;hbbs 监听 21115(tcp) , 21…

Jmeter中同步定时器使用注意点

1.设置数量不可大于总线程数量&#xff0c;不然会一直等待 2.设置数量必须与总线程数量成整数倍数&#xff0c;不然还是要一直等。 3.当配置的数量小于线程数时&#xff0c;最好把循环打开&#xff0c;避免最后一次未准备好的线程数量达不到并发数。

作为高速通道光纤传输模式怎么理解以及到底有哪些?

光纤的传输模式主要取决于光纤的结构(如纤芯直径和折射率分布),不同模式对应光波在光纤中传播的不同路径和电磁场分布。以下是光纤传输模式的主要分类及特点: 1. 单模光纤(Single-Mode Fiber, SMF) 核心特点: 纤芯直径极小(通常为 8-10微米),仅允许光以单一模式(…

小程序Npm package entry file not found?

修改依赖包的入口文件 看是不是cjs&#xff0c;小程序不支持cjs

Android HAL HIDL

1 Android HAL HIDL 1.1 Android中查看有哪些HIDL HAL HIDL是Treble Interface的一部分。 adb root adb shell # lshal 1.2 Android打印C调用栈 #include <utils/CallStack.h> 在需要打印的地方加如下的定义。 android::CallStack stack("oem"); logcat | g…

【AI 加持下的 Python 编程实战 2_11】DIY 拓展:从扫雷小游戏开发再探问题分解与 AI 代码调试能力(下)

&#xff08;接 上篇&#xff09; 5 复盘与 Copilot 的交互过程 前面两篇文章分别涵盖了扫雷游戏的问题分解和代码实现过程&#xff0c;不知道各位是否会有代码一气呵成的错觉&#xff1f;实际上&#xff0c;为了达到最终效果&#xff08;如下所示&#xff09;&#xff0c;我…

游戏状态管理:用Pygame实现场景切换与暂停功能

游戏状态管理:用Pygame实现场景切换与暂停功能 在开发游戏时,管理游戏的不同状态(如主菜单、游戏进行中、暂停等)是非常重要的。这不仅有助于提升玩家的游戏体验,还能使代码结构更加清晰。本文将通过一个简单的示例,展示如何使用Pygame库来实现游戏中的场景切换和暂停功…

Java后端开发day36--源码解析:HashMap

&#xff08;以下内容均来自上述课程&#xff09; 1. HashMap&#xff08;一&#xff09; 底层&#xff1a;数组链表红黑树 1.1 前提准备 查看源码&#xff1a;选中HashMap–ctrlB 小细节&#xff1a;快捷键ctrlf12–跳出目录结构 蓝色圆圈&#xff1a;class 证明是类名粉…

RT-Thread学习笔记(四)

RT-Thread学习笔记 线程间同步信号量信号量的使用和管理动态创建信号量静态创建信号量获取信号量信号量同步实列互斥量互斥量的使用和管理互斥量动态创建互斥量静态创建互斥量获取和释放互斥量实例事件集事件集的使用和管理动态创建事件集静态初始化事件集发送和接收事件事件集…

element ui el-col的高度不一致导致换行

问题&#xff1a;ell-col的高度不一致导致换行&#xff0c;刷新后审查el-col的高度一致 我这边是el-col写的span超过了24&#xff0c;自行换行&#xff0c;测试发现初次进入里面的高度渲染的不一致&#xff0c;有的是51px有的是51.5px 问题原因分析 Flex布局换行机制 Elemen…