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

BFS算法篇——FloodFill问题的高效解决之道(下)

在这里插入图片描述

文章目录

  • 前言
  • 一. 图像渲染
    • 1.1 题目链接:https://leetcode.cn/problems/flood-fill/description/
    • 1.2 题目分析:
    • 1.3 思路讲解:
    • 1.4 代码实现:
  • 二. 岛屿数量
    • 2.1 题目链接:https://leetcode.cn/problems/number-of-islands/description/
    • 2.2 题目分析:
    • 2.3 思路讲解:
    • 2.4 代码实现:
  • 三. 岛屿的最大面积
    • 3.1 题目链接:https://leetcode.cn/problems/max-area-of-island/description/
    • 3.2 题目分析:
    • 3.3 思路讲解:
    • 3.4 代码实现:
  • 四. 被围绕的区域
    • 4.1 题目链接:https://leetcode.cn/problems/surrounded-regions/description/
    • 4.2 题目分析:
    • 4.3 思路讲解:
    • 4.4 代码实现:
  • 小结

前言

上篇我们简要介绍了用BFS算法解决FloodFill问题,本篇我们将结合具体题目,进一步深化对于该算法的理解运用。

一. 图像渲染

1.1 题目链接:https://leetcode.cn/problems/flood-fill/description/

1.2 题目分析:

  • 有一个m*n的二维数组表示图像,其中的值代表颜色
  • 给出起始坐标和目标颜色,要求与起点相接并且值相同的所有像素点的值,都改为给定color的值
  • 遍历方向为上下左右

1.3 思路讲解:

结合上篇内容很容易联想到使用bfs算法,但是在上下左右四个方向遍历时,可以通过初始化两个数组,大大简化步骤。

在这里插入图片描述
如图,将二维数组映射在平面直角坐标系内,上下左右四个方向的坐标变化如下。

之后我们按照层序遍历的方式,将各个顶点依次入队列,并按照上下左右的方向遍历判断即可。

1.4 代码实现:

class Solution {
public:vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {int prev=image[sr][sc];int dx[]={0,0,-1,1};int dy[]={1,-1,0,0};int m=image.size();//行int n=image[0].size();//列if(prev==color){return image;}//处理特殊情况queue<pair<int,int>> q;q.push({sr,sc});while(q.size()){auto [a,b]=q.front();q.pop();image[a][b]=color;//下一层入队列//处理边界情况for(int i=0;i<4;i++){int x=a+dx[i],y=b+dy[i];if(x>=0&&x<m&&y>=0&&y<n&&image[x][y]==prev){q.push({x,y});}}}return image;}
};

二. 岛屿数量

2.1 题目链接:https://leetcode.cn/problems/number-of-islands/description/

2.2 题目分析:

  • 给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

  • 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。(不考虑斜侧方向,只考虑水平和竖直)

  • 此外,你可以假设该网格的四条边均被水包围。

2.3 思路讲解:

岛屿与上题的上色问题类似,都要求一个点内附近相接的同属性点。
通俗来讲,即一大块相接且被0围住的1,即代表一块岛屿。

因此,我们可以遍历数组内的每一个点,如果为1,则说明此处有一个岛屿,使用bfs算法将其周围的1全部转化为0

注意:本题并未提到原数组是否可以更改,因此我们为了以防万一,可以通过标记数组的方式进行1的转换。

2.4 代码实现:

class Solution {
public:int dx[4]={0,0,-1,1};int dy[4]={1,-1,0,0};bool vis[301][301]={0};int m,n;int ret=0;//岛屿数量void bfs(vector<vector<char>>& gird,int i,int j){queue<pair<int,int>> q;q.push({i,j});vis[i][j]=true;while(q.size()){auto [a,b]=q.front();q.pop();for(int k=0;k<4;k++){int x=a+dx[k],y=b+dy[k];if(x>=0&&x<m&&y>=0&&y<n&&vis[x][y]==0&&gird[x][y]=='1'){q.push({x,y});vis[x][y]=true;}}}}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]==0){ret++;bfs(grid,i,j);}}}return ret;}
};

三. 岛屿的最大面积

3.1 题目链接:https://leetcode.cn/problems/max-area-of-island/description/

3.2 题目分析:

  • 岛屿的规则与上相同
  • 本题要求返回岛屿的最大面积,而非岛屿的数量

3.3 思路讲解:

大体思路与上题相同,只需要记录下遍历过程中最大的岛屿面积,并在最终返回即可。

3.4 代码实现:

class Solution {
public:int dx[4]={0,0,-1,1};int dy[4]={1,-1,0,0};bool vis[51][51]={false};//标记数组int m,n;int ret=0;//最大面积int bfs(vector<vector<int>>& grid,int i,int j){int count=1;//记录该岛屿面积queue<pair<int,int>> q;q.push({i,j});vis[i][j]=true;while(q.size()){auto [a,b]=q.front();q.pop();for(int k=0;k<4;k++){int x=a+dx[k],y=b+dy[k];if(x>=0&&x<m&&y>=0&&y<n&&grid[x][y]==1&&vis[x][y]==0){q.push({x,y});count++;vis[x][y]=true;}}}return count;}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]==0){int temp=bfs(grid,i,j);ret=max(ret,temp);}}}return ret;}
};

四. 被围绕的区域

4.1 题目链接:https://leetcode.cn/problems/surrounded-regions/description/

4.2 题目分析:

  • 给定一个 m x n 的矩阵 board ,由若干字符 ‘X’ 和 ‘O’ 组成,捕获所有被围绕的区域
  • 围绕区域指被X包围的O
  • 捕获指将O替换为X

4.3 思路讲解:

  • 首先需要明确,最外层的O由于没有被X包围,因此是永远不会被替换的
  • 因此被替换的只有边界内的O

所以我们只需要利用BFS算法遍历并替换即可。

注意:由于BFS算法在上下左右遍历时,可能存在边界上有O的情况,处理起来较为复杂。我们可以采取正难则反的思路。
在遍历之前,将边界上所有的O转化为*

4.4 代码实现:

class Solution {
public:int dx[4]={0,0,-1,1};int dy[4]={1,-1,0,0};int m,n;void bfs(vector<vector<char>>& board,int i,int j){queue<pair<int,int>> q;q.push({i,j});while(q.size()){auto [a,b]=q.front();q.pop();for(int k=0;k<4;k++){int x=a+dx[k],y=b+dy[k];if(x>=0 && x<m && y>=0 && y<n && board[x][y]=='O'){q.push({x,y});board[x][y]='*';}}}}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'){board[0][j]='*';bfs(board,0,j);}if(board[m-1][j]=='O'){board[m-1][j]='*';bfs(board,m-1,j);}}//遍历最左和最右两列for(int i=0;i<m;i++){if(board[i][0]=='O'){board[i][0]='*';bfs(board,i,0);}if(board[i][n-1]=='O'){board[i][n-1]='*';bfs(board,i,n-1);}}for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(board[i][j]=='O'){board[i][j]='X';}else if(board[i][j]=='*'){board[i][j]='O';}}}//还原操作}
};

小结

本篇关于BFS算法的介绍就暂告段落啦,希望能对大家的学习产生帮助,欢迎各位佬前来支持斧正!!!
在这里插入图片描述

相关文章:

BFS算法篇——FloodFill问题的高效解决之道(下)

文章目录 前言一. 图像渲染1.1 题目链接&#xff1a;https://leetcode.cn/problems/flood-fill/description/1.2 题目分析&#xff1a;1.3 思路讲解&#xff1a;1.4 代码实现&#xff1a; 二. 岛屿数量2.1 题目链接&#xff1a;https://leetcode.cn/problems/number-of-islands…...

Android性能优化

Android性能优化 如何优化一个包含大量图片加载的Android应用&#xff0c;以提高性能和用户体验&#xff1f; 优化一个包含大量图片加载的Android应用&#xff0c;可以从以下几个方面入手&#xff0c;以提高性能和用户体验&#xff1a; 选择合适的图片加载库 使用成熟的图片…...

1、http介绍

一、HTTP 和 HTTPS 简介 HTTP&#xff08;HyperText Transfer Protocol&#xff09; 用途&#xff1a;用于网页数据传输&#xff08;不加密&#xff09;。协议特性&#xff1a;以明文形式传输数据&#xff0c;默认端口 80&#xff0c;无身份验证和完整性保护。典型场景&#xf…...

2.6 寒假训练营补题

C Tokitsukaze and Balance String (hard) 题目描述 本题为《Tokitsukaze and Balance String (easy)》的困难版本&#xff0c;两题的唯一区别在于 n n n 的范围。 一个字符串是平衡的&#xff0c;当且仅当字符串中 "01" 连续子串的个数与 "10" 连续子…...

kafka生产者之发送模式与ACK

文章目录 Kafka的发送模式Kafka的ack机制发送模式与ack的关联重试次数总结 在Kafka中&#xff0c;发送模式与ack机制紧密相关&#xff0c;它们共同影响着消息发送的可靠性和性能。 Kafka的发送模式 发后即忘&#xff08;Fire and Forget&#xff09;&#xff1a;生产者发送消息…...

笔记:蓝桥杯python搜索(3-2)——DFS剪支和记忆化搜索

目录 一、DFS剪支 二、例题 P2942 数字王国之军训军队 P3075 特殊的多边形 三、记忆化搜索 四、例题 例题 P3820 混境之地 P216 地宫取宝 一、DFS剪支 在搜索过程中&#xff0c;如果需要完全遍历所有情况可能需要很多时间在搜索到某种状态时&#xff0c;根据当前状态判断…...

ChatBox+硅基流动Deepseek_R1开源API 满血(671B)部署教程,全程干货无废话

DeepSeek开源深度推理模型火爆发布&#xff0c;网络流量过大经常导致服务器崩溃&#xff0c;所以一般有两种方法解决这个问题 如果你的硬件支持&#xff0c;或者保密文档&#xff0c;保密单位&#xff0c;那么可以部署在本地端。但是再好的电脑也不能让DS满血复活&#xff0c;…...

35~37.ppt

目录 35.张秘书-《会计行业中长期人才发展规划》 题目​ 解析 36.颐和园公园&#xff08;25张PPT) 题目​ 解析 37.颐和园公园&#xff08;22张PPT) 题目 解析 35.张秘书-《会计行业中长期人才发展规划》 题目 解析 插入自定义的幻灯片&#xff1a;新建幻灯片→重用…...

畅快使用DeepSeek-R1的方法

腾讯云API接入Cherry Studio简明指南-畅快使用DeepSeek-R1 注意&#xff1a;腾讯云API针对deepseek限时免费&#xff08;后续即使收费也较为便宜&#xff0c;可以作为长期使用的方法&#xff09;&#xff0c;并且比华为的API要快不少。 一、获取腾讯云API密钥 登录并进入腾讯…...

【人工智能】Python中的序列到序列(Seq2Seq)模型:实现机器翻译

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 序列到序列(Seq2Seq)模型是自然语言处理(NLP)中一项核心技术,广泛应用于机器翻译、语音识别、文本摘要等任务。本文深入探讨Seq2Seq模…...

【算法】动态规划专题⑥ —— 完全背包问题 python

目录 前置知识进入正题模板 前置知识 【算法】动态规划专题⑤ —— 0-1背包问题 滚动数组优化 完全背包问题是动态规划中的一种经典问题&#xff0c;它与0-1背包问题相似&#xff0c;但有一个关键的区别&#xff1a;在完全背包问题中&#xff0c;每种物品都有无限的数量可用。…...

记一次基于manifest v3开发谷歌插件

背景 头疼在国际化功能普遍的前端项目中&#xff0c;如果你在处理或者在某一块功能上新增一些需求的时候&#xff0c;在没有国际化功能的页面中&#xff0c;我们随便复制一些文本&#xff0c;然后在vs code中全局搜索&#xff0c;很快就可以找到所要更改的代码文件在哪里&…...

C# OpenCvSharp 部署MOWA:多合一图像扭曲模型

目录 说明 效果 项目 代码 下载 参考 C# OpenCvSharp 部署MOWA&#xff1a;多合一图像扭曲模型 说明 算法模型的paper名称是《MOWA: Multiple-in-One Image Warping Model》 ariv链接 https://arxiv.org/pdf/2404.10716 效果 Stitched Image 翻译成中文意思是&…...

本地部署DeepSeek-R1模型(新手保姆教程)

背景 最近deepseek太火了&#xff0c;无数的媒体都在报道&#xff0c;很多人争相着想本地部署试验一下。本文就简单教学一下&#xff0c;怎么本地部署。 首先大家要知道&#xff0c;使用deepseek有三种方式&#xff1a; 1.网页端或者是手机app直接使用 2.使用代码调用API …...

神经网络常见激活函数 5-PReLU函数

文章目录 PReLU函数导函数函数和导函数图像优缺点pytorch中的PReLU函数tensorflow 中的PReLU函数 PReLU 参数化修正线性单元:Parametric ReLU 函数导函数 PReLU函数 P R e L U { x x > 0 α x x < 0 ( α 是可训练参数 ) \rm PReLU \left\{ \begin{array}{} x \qua…...

2025我的第二次社招,写在春招之季

先说一个好消息&#xff0c;C那些事 4w star了&#xff01; 前面断更了一个月&#xff0c;本篇文章就可以看到原因&#xff0c;哈哈。 大家好&#xff0c;我叫光城&#xff0c;腾讯实习转正做后端开发&#xff0c;后去小公司做数据库内核&#xff0c;经过这几年的成长与积累&am…...

Visual Studio Code中文出现黄色框子的解决办法

Visual Studio Code中文出现黄色框子的解决办法 一、vsCode中文出现黄色框子-如图二、解决办法 一、vsCode中文出现黄色框子-如图 二、解决办法 点击 “文件”点击 “首选项”点击 “设置” 搜索框直接搜索unicode选择“文本编辑器”&#xff0c;往下滑动&#xff0c;找到“Un…...

threejs开源代码之-旋转的彩色立方体

效果&#xff1a;旋转的彩色立方体 效果描述&#xff1a; 一个立方体在场景中旋转。立方体的每个面有不同的颜色。使用自定义着色器为立方体添加动态的光影效果。 代码实现 import * as THREE from three; import { OrbitControls } from three/examples/jsm/controls/OrbitC…...

visual studio 2008的试用版评估期已结束的解决办法

visual studio 2008试用期过了后&#xff0c;再次启动时提示&#xff1a;visual studio的试用版评估期已结束。 需要的工具&#xff1a;补丁文件PatchVS2008.exe 解决办法&#xff1a; 1.在“控制面板”-“添加删除程序”中选择visual studio 2008&#xff0c;点击“更改/卸载”…...

解锁 DeepSeek 模型高效部署密码:蓝耘平台深度剖析与实战应用

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

Unity-MCP协议:可嵌入、可协商的AI上下文通信标准

1. 这不是又一个“AI插件”&#xff0c;而是Unity开发工作流的底层重定义你有没有过这样的时刻&#xff1a;在Unity里反复调整Animator Controller的过渡条件&#xff0c;只为让角色转身动画不穿模&#xff1b;写完一段NavMesh寻路逻辑&#xff0c;却要花两小时调试Agent卡在斜…...

从测速到配置:一套完整的cFosSpeed网络加速保姆级教程(适用于小白)

从零开始掌握cFosSpeed&#xff1a;网络加速全流程实战指南对于经常进行在线游戏、视频会议或大文件传输的用户来说&#xff0c;网络延迟和带宽利用率低下往往是影响体验的关键痛点。cFosSpeed作为一款专业的网络流量优化工具&#xff0c;能够显著改善这些问题&#xff0c;但许…...

信息系统项目管理师核心知识点精讲

一、项目整合管理(重点:项目章程与项目管理计划) 知识点详解: 项目整体管理是项目管理知识体系的核心,它确保项目各要素协调统一。在考试中,特别要掌握项目章程和项目管理计划的区别与联系。 项目章程是项目的“出生证明”,由项目发起人发布。它正式授权项目,赋予项…...

Lampiao 靶场

Lampiao 靶场完整渗透解析一、靶场环境信息攻击机&#xff08;Kali&#xff09;IP&#xff1a;192.168.146.128靶机 IP&#xff1a;192.168.146.129目标&#xff1a;获取靶机 root 权限与 flag二、步骤 1&#xff1a;信息收集&#xff08;端口与服务扫描&#xff09;nmap -p- -…...

亚马逊卖家公开信息数据提取:反爬攻防战与 Python 批量采集实战

摘要&#xff1a; 批量获取亚马逊&#xff08;Amazon&#xff09;第三方卖家的商业名称、信用代码和注册地址等信息&#xff0c;对于跨境 B2B 拓客和供应链分析具有重要意义。然而&#xff0c;亚马逊的 Cloudflare 盾和 Robot 验证码构成了极高的反爬门槛。本文将深度解析亚马逊…...

Yokogawa AAI835-H50/K4A00模拟输入/输出模块

Yokogawa AAI835-H50/K4A00 模拟输入/输出模块产品特点&#xff1a;通道配置&#xff1a;共8个通道&#xff0c;含4路模拟输入和4路模拟输出。信号类型&#xff1a;所有通道均支持4-20mA标准电流信号。HART通信&#xff1a;支持HART协议&#xff0c;可与智能现场设备双向数字通…...

ARM PMU外部接口与性能监控寄存器详解

1. ARM性能监控寄存器外部接口深度解析性能监控单元(PMU)是现代处理器架构中用于硬件性能分析的核心模块&#xff0c;它通过一组可编程计数器实时捕获处理器微架构层面的各类事件。在ARMv8/v9架构中&#xff0c;PMU不仅可以通过系统寄存器访问&#xff0c;还提供了标准化的外部…...

51单片机驱动ST7735S彩屏避坑指南:从5秒刷屏到流畅贪吃蛇的优化实战

51单片机驱动ST7735S彩屏性能优化实战&#xff1a;从卡顿到流畅游戏的蜕变之路当一块128x160分辨率的ST7735S彩屏遇上传统的51单片机&#xff0c;这种组合看似矛盾却又充满挑战。许多开发者初次尝试时会发现&#xff0c;原本在STM32等平台上运行流畅的显示驱动&#xff0c;移植…...

从多路复用到三维光阵:Arduino驱动8x8x8 LED立方体全解析

1. 项目概述&#xff1a;用Arduino点亮一个三维世界几年前&#xff0c;我第一次在创客展上看到一个8x8x8的LED立方体&#xff0c;那种由数百个光点构成的、在三维空间中流动的动画效果&#xff0c;瞬间就把我吸引住了。它不像普通的平面LED屏&#xff0c;而是真正有“深度”的光…...

Java数组工具类实战:设计不可实例化的静态工具类

实现一个工具类 MathUtils&#xff0c;满足以下要求&#xff1a; 1. 所有方法均为静态&#xff0c;且该类不能从外部实例化&#xff08;提示&#xff1a;使用私有构造器&#xff09;。 2. 提供三个静态方法&#xff1a;- maxArray(int[] arr)&#xff1a;返回较大值&#xff1b…...