【刷题21】BFS解决FloodFill算法专题

目录

  • 一、图像渲染
  • 二、岛屿数量
  • 三、岛屿的最大面积
  • 四、被环绕的区域

一、图像渲染

题目:
在这里插入图片描述
思路:

  • 如果起始位置的颜色(数值)与color相同,直接返回该数组
  • 上下左右一层一层的找与当前位置颜色相同的,并且该位置不越界,然后放入队列(是先不越界,再比较是否颜色相同)
  • 一个位置上下左右找完,将该位置的颜色变成color,然后pop
  • 注意:push到队列的下标有重复的可能,就continue,但是,continue前要pop,不然会死循环

在这里插入图片描述
代码:

class Solution {
public:int dx[4] = {-1,1,0,0};//行 上下左右int dy[4] = {0,0,-1,1};//列 上下左右vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {int prev = image[sr][sc];// 起始位置的数字if(prev == color) return image;int row = image.size(), col = image[0].size();queue<pair<int,int>> q;q.push({sr, sc});while(!q.empty()){int k = q.size();while(k--){int x1 = q.front().first;int y1 = q.front().second;if(image[x1][y1] == color){q.pop();//!continue;}for(int i=0;i<4;i++){int x2 = x1 + dx[i];int y2 = y1 + dy[i];if(x2 >= 0 && x2 < row && y2 >= 0 && y2 < col && image[x1][y1] == image[x2][y2]){q.push({x2, y2});}}image[x1][y1] = color;q.pop();}}return image;}
};

二、岛屿数量

题目:
在这里插入图片描述
思路:BFS+队列

  • 多一个bool类型的vim数组,初始化为false
  • 与上一题几乎相同,两层for循环,符合条件的就count++;不需要担心重复,因为有vim数组标记是否已经用过了
  • 队列——一层一层找字符1,当前位置的上下左右不越界、为字符1、没使用过的就进队列,然后当前位置标记为true(使用过了),队列头pop
  • 最后返回count

代码:

class Solution {
public:int dx[4] = {-1,1,0,0};int dy[4] = {0,0,-1,1};int n = 0, m = 0, count = 0;bool vim[300][300] = {false};int numIslands(vector<vector<char>>& grid) {n = grid.size();m = grid[0].size();for(int i=0; i<n; i++){for(int j=0; j<m; j++){if(grid[i][j] == '1' && !vim[i][j]){count++;Bfs(grid, i, j);}}}return count;}void Bfs(vector<vector<char>>& grid, int x, int y){queue<pair<int, int>> q;q.push({x, y});while(!q.empty()){int k = q.size();while(k--){int x1 = q.front().first;int y1 = q.front().second;if(vim[x1][y1]){q.pop();continue;}for(int i=0; i<4; i++){int x2 = x1+dx[i];int y2 = y1+dy[i];if(x2>=0&&x2<n&&y2>=0&&y2<m && grid[x2][y2]=='1' && !vim[x2][y2]){q.push({x2, y2});}}vim[x1][y1] = true;q.pop();}}}
};

三、岛屿的最大面积

题目:
在这里插入图片描述
思路:BFS+队列

  • 与上题思路相同,但是上题求的是岛屿数量,本题是岛屿的最大面积,都是用变量count计数,只是执行count++的位置不同。然后一个岛屿好了(队列为空)就更新下最大值

代码:

class Solution {
public:int dx[4] = {-1,1,0,0};int dy[4] = {0,0,-1,1};int n = 0, m = 0, Max = 0;bool vim[50][50] = {false};int maxAreaOfIsland(vector<vector<int>>& grid) {n = grid.size();m = grid[0].size();for(int i=0; i<n; i++){for(int j=0; j<m; j++){if(grid[i][j] == 1 && !vim[i][j]){Bfs(grid, i, j);}}}return Max;}void Bfs(vector<vector<int>> &grid, int x, int y){queue<pair<int, int>> q;int count = 0;// 临时的 一个岛屿的面积q.push({x, y});while(!q.empty()){int k = q.size();while(k--){// push上下左右int x1 = q.front().first;int y1 = q.front().second;if(vim[x1][y1])//!{q.pop();continue;}for(int i=0; i<4; i++){int x2 = x1+dx[i];int y2 = y1+dy[i];if(x2>=0&&x2<n&&y2>=0&&y2<m && grid[x2][y2]==1 && !vim[x2][y2]){q.push({x2, y2});}}// count++;vim[x1][y1] = true;q.pop();}}// 更新Maxif(count > Max) Max = count;}
};

四、被环绕的区域

题目:
在这里插入图片描述

思路:Bfs+队列

  • 与上题思路类似
  • 正难则反,先从边界的位置入手,如果该岛屿是有临边界的,就不能变成X;反之,排除了边界的岛屿,那么只剩下中间的岛屿,就要全部变成X
  • 是边界的岛屿还要用另一个bool数组标记,最终标记过的就不用变成X,其他的全都要变成X

代码:

class Solution {
public:int dx[4] = {-1,1,0,0};int dy[4] = {0,0,-1,1};int n = 0, m = 0;bool vim[200][200] = {false};// 是否使用过bool flag[200][200] = {false};// 是否要变成Xvoid solve(vector<vector<char>>& board) {n = board.size();m = board[0].size();for(int i=0; i<n; i++){for(int j=0; j<m; j++){if(i>0 && i<n-1 && j>0 && j<m-1){continue;}if(board[i][j] == 'O' && !vim[i][j]){Bfs(board, i, j);}}}for(int i=0; i<n; i++){for(int j=0; j<m; j++){if(!flag[i][j]){board[i][j] = 'X';}}}}void Bfs(vector<vector<char>>& board, int x, int y){queue<pair<int, int>> q;q.push({x, y});while(!q.empty()){int k = q.size();while(k--){int x1 = q.front().first;int y1 = q.front().second;if(vim[x1][y1]){q.pop();continue;}for(int i=0;i<4;i++){int x2 = x1+dx[i];int y2 = y1+dy[i];if(x2>=0&&x2<n&&y2>=0&&y2<m && board[x2][y2] == 'O' && !vim[x2][y2]){q.push({x2, y2});}}vim[x1][y1] = true;flag[x1][y1] = true;q.pop();}}}
};

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

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

相关文章

【大数据技术基础】 课程 第8章 数据仓库Hive的安装和使用 大数据基础编程、实验和案例教程(第2版)

第8章 数据仓库Hive的安装和使用 8.1 Hive的安装 8.1.1 下载安装文件 访问Hive官网&#xff08;http://www.apache.org/dyn/closer.cgi/hive/&#xff09;下载安装文件apache-hive-3.1.2-bin.tar.gz 下载完安装文件以后&#xff0c;需要对文件进行解压。按照Linux系统使用的…

C++设计模式行为模式———中介者模式

文章目录 一、引言二、中介者模式三、总结 一、引言 中介者模式是一种行为设计模式&#xff0c; 能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互&#xff0c; 迫使它们通过一个中介者对象进行合作。 中介者模式可以减少对象之间混乱无序的依赖关系&…

泥石流灾害风险评估与模拟丨AI与R语言、ArcGIS、HECRAS融合,提升泥石流灾害风险预测的精度和准确性

目录 第一章 理论基础 第二章 泥石流风险评估工具 第三章 数据准备与因子提取 第四章 泥石流灾害评价 第五章 HECRAS软件的应用 第六章 操作注意事项与模型优化 泥石流灾害的频发与严重后果&#xff0c;已成为全球范围内防灾减灾工作的重大挑战。随着科技的不断进步&…

HarmonyOS:使用ArkWeb构建页面

一、简介 页面加载是Web组件的基本功能。根据页面加载数据来源可以分为三种常用场景&#xff0c;包括加载网络页面、加载本地页面、加载HTML格式的富文本数据。 页面加载过程中&#xff0c;若涉及网络资源获取&#xff0c;需要配置ohos.permission.INTERNET网络访问权限。 二、…

MATLAB的语音信号采集与处理分析

1、基本描述 本文描述的系统是一个全面而精细的语音信号处理平台&#xff0c;核心组件由MATLAB的高级功能模块构建而成。系统的核心交互界面&#xff0c;借助于MATLAB的uifigure函数搭建&#xff0c;为用户提供了一个直观且响应迅速的操作环境。通过设计的GUI按钮&#xff0c;如…

opencv undefined reference to `cv::noarray()‘ 。window系统配置opencv,找到opencv库,但连接不了

之前都是在ubuntu里用opencv&#xff0c;今天为了方便在平时用Window10系统也用下c版的cv&#xff0c;就想配置一下vscode的cv环境&#xff0c;直接下载了一个编译好的opencv库&#xff08;带build文件夹的&#xff09;&#xff0c;刚开始用的是visual studio的编译器&#xff…

经典游戏:飞机大战游戏python设计与实现

《飞机大战》是一款经典的二维飞行射击游戏&#xff0c;其核心玩法是控制玩家飞机与敌机作战&#xff0c;通过击落敌机获取分数并尽量避免被敌机击中。根据提供的代码&#xff0c;飞机大战的设计和实现可以分为以下几个主要部分&#xff1a;游戏初始化、游戏界面设计、玩家控制…

填补覆盖空白,小型机器人让智能清洁再“净”一步!

尽管不同商用场景的大多区域都十分相似&#xff0c;但非标准化的场景属性无法避免的导致了不少corner case。面对狭窄场景&#xff0c;“强悍”的商用清洁机器人迎来了自己的“职业危机”。 随着城市化进程的推进和服务业比重提升&#xff0c;商场、写字楼等细分场景不断扩容&a…

【linux学习指南】VSCode部署Ubantu云服务器,与Xshell进行本地通信文件编写

文章目录 &#x1f4dd;前言&#x1f320; 步骤&#x1f309;测试同步 &#x1f6a9;总结 &#x1f4dd;前言 本文目的是讲使用Vscode连接Ubantu,与本地Xshell建立通信同步文件编写。 查看本机系统相关信息&#xff1a; cat /etc/lsb*DISTRIB_IDUbuntu: 表示这是 Ubuntu 发行…

Hadoop的MapReduce详解

文章目录 Hadoop的MapReduce详解一、引言二、MapReduce的核心概念1、Map阶段1.1、Map函数的实现 2、Reduce阶段2.1、Reduce函数的实现 三、MapReduce的执行流程四、MapReduce的使用实例Word Count示例1. Mapper类2. Reducer类3. 执行Word Count 五、总结 Hadoop的MapReduce详解…

c#:winform引入bartender

1、vs新建项目 ①选择Windows窗体应用&#xff08;.NET Framework&#xff09; 2、将bartender引入vs中 ①找到bartender的安装目录&#xff0c;复制Seagull.BarTender.Print.dll文件 ②粘贴到项目->bin->Debug文件&#xff0c;并可创建Model文件夹&#xff1a;为了存放…

基于机器学习的人脸识别算法matlab仿真,对比GRNN,PNN,DNN以及BP四种网络

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 MATLAB2022A 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视频&#xff09…

详细描述一下Elasticsearch更新和删除文档的过程?

大家好&#xff0c;我是锋哥。今天分享关于【详细描述一下Elasticsearch更新和删除文档的过程&#xff1f;】面试题。希望对大家有帮助&#xff1b; 详细描述一下Elasticsearch更新和删除文档的过程&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 E…

关于相机选型的一些参数说明

上一篇&#xff1a;关于相机的一些参数计算&#xff08;靶面、视野等&#xff09; 目录 1.卷帘快门和全局快门1.1 卷帘快门1.2 全局快门PS&#xff1a;视觉伺服与快门选择 2.黑白和彩色3.CCD和CMOS3.1 CCD3.2 CMOSCCD VS CMOS 4.面阵和线扫4.1 面阵4.2 线扫4.3 面阵 VS 线扫 5.…

ctfshow

1,web21 Basic认证采用Base64加密方式&#xff0c;Base64解码字符串发现是 用户名:密码 的格式进行Base64编码。 密码shark63 2,web22 用 子域名扫描器 扫出flag.ctf.show拿到flag&#xff0c;但这个域名已经没了所以就直接交的官方提供的flag。 3,web23 这段PHP代码是一个简单…

条件编译(手绘)

大家好&#xff0c;今天给大家分享一下条件编译&#xff0c;由于符号有点难写&#xff0c;我已经将内容记在笔记本中&#xff0c;现在供大家学习。 那么我们来看看代码的实现

前端和后端

前端和后端 前端、后端的编程语言/服务器前端定义前端技术栈后端定义后端技术栈 web服务器数据库浏览器URL 前端、后端的编程语言/服务器 前端定义 前端指的是用户在使用软件时所看到的那部分&#xff0c;是与用户直接进行交互的部分。主要负责展示信息或数据&#xff0c;并将…

大数据技术之SparkCore

RDD概述 什么是RDD RDD&#xff08;Resilient Distributed Dataset&#xff09;叫做弹性分布式数据集&#xff0c;是Spark中最基本的数据抽象。代码中是一个抽象类&#xff0c;它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。 RDD五大特性 RDD编程 RDD的创…

MacOS通过VMware Fusion安装windows 11问题汇总

环境 虚拟机&#xff0c;VMware Fusion 13.6.1本地机器&#xff0c;ARM芯片的Mac&#xff0c;系统版本14.5Windows系统镜像&#xff0c;Window11 ARM 64 bit 安装卡在WiFi连接界面 适合我本地环境的解决步骤为&#xff1a; 1、系统设置网络共享 我开启的是en5&#xff0c;这…

高度统一:极大和极小如何统于一

英语里有两个单词&#xff1a; min n.最小值max n.最大值 min和max其实是缩略值&#xff0c;它们词源上的本质&#xff0c;min来自于“极小”&#xff0c;max来自于“极大”&#xff0c;都来自于“极&#xff0c;极限&#xff0c;极度”的概念 那么&#xff0c;问题来了&…