[优选算法专栏]专题十五:FloodFill算法(一)

本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。

💓博主csdn个人主页:小小unicorn
⏩专栏分类:算法从入门到精通
🚚代码仓库:小小unicorn的代码仓库🚚
🌹🌹🌹关注我带你学习编程知识

专题十五

  • 图像渲染
    • 算法原理:
    • 代码实现:
  • 岛屿数量
    • 算法原理:
    • 代码实现:

图像渲染

题目来源:733.图像渲染

有一幅以 m x n 的二维整数数组表示的图画 image ,其中 image[i][j] 表示该图画的像素值大小。

你也被给予三个整数 sr , sc 和 newColor 。你应该从像素 image[sr][sc] 开始对图像进行 上色填充 。

为了完成 上色工作 ,从初始像素开始,记录初始坐标的 上下左右四个方向上 像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应 四个方向上 像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为 newColor 。

最后返回 经过上色渲染后的图像 。
在这里插入图片描述
在这里插入图片描述

算法原理:

本题要用BFS来解决此问题:
具体如下:
在这里插入图片描述

  1. 从给定位置开始,上下左右搜索为第一层。
  2. 从第一层两个位起点继续上下左右一层一层剥开。
  3. 依次内推…
  4. 当某一层上下左右搜索中,没有发现目标值就结束。

在上面搜索过程中,我们可以边在搜索过程中就进行修改,达到优化效果。

在这里插入图片描述

代码实现:

在代码实现之前,我们先做一下预处理。
通常BFS宽度优先遍历中,要对四个方向或者八个方向进行搜索,此时我们可以定义一个向量数组。
在这里插入图片描述
dx与dy为横坐标与纵坐标的偏移量。我们让坐标加上这个偏移量就是搜索后的宽度优先遍历的四个方向。

class Solution
{//存的是一个数对(坐标)typedef pair<int,int> PII;//向量数组int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};
public:vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {//先标记一下需要修改的像素值int prev=image[sr][sc];//处理边界情况:if(prev==color)return image;queue<PII> q;q.push({sr,sc});//获取起始点位置int m=image.size(),n=image[0].size();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&&y<n&&image[x][y]==prev){//满足情况入队q.push({x,y});}}}return image;}
};

岛屿数量

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

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

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

在这里插入图片描述

算法原理:

题目很好理解:
在这里插入图片描述
看到此类问题,首选BFS。
我们来模拟一下这个过程:
在这里插入图片描述
扫描矩阵,找到一个陆地的时候,就将这个陆地连接的联通快找到。怎么找用BFS。
此时找到一个岛屿,定义一个变量,让我们的ret++即可,但是有个问题:在我们层序遍历扩展到一个位置时,是不能让他拓展回去的。
在这里插入图片描述
那么此时有两种办法:

  1. 在原数组进行修改
  2. 定义一个bool数组

第一种会修改原始数组的值,我们不推荐。
通常我们会采取第二种方式:
定义一个vis[m][n]数组:
在这里插入图片描述
只要我们遍历过次位置,就将定义为true.数组还有个作用,当我们发现值为1,为true时ret不用++反之false就++。

代码实现:

class Solution 
{//向量数组int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};bool vis[301][301];int m,n;
public:int numIslands(vector<vector<char>>& grid){m=grid.size(),n=grid[0].size();int ret = 0;for(int i=0;i <m; i++){for(int j=0;j<n; j++){    if(grid[i][j]=='1' && vis[i][j]==false){   ret++;bfs(grid,i,j);// 把这块陆地全部标记一下了}}}return ret;}void bfs(vector<vector<char>>& grid,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&&y<n&&grid[x][y]=='1'&&vis[x][y]==false){//满足情况入队q.push({x,y});vis[x][y]=true;}}}}
};

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

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

相关文章

kubectl 启用shell自动补全功能

官网手册参考&#xff1a;https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-linux/ 系统&#xff1a;centos7 补全脚本依赖于工具 bash-completion&#xff0c; 所以要先安装它&#xff08;可以用命令 type _init_completion 检查 bash-completion 是否已安装&a…

//简单函数_素数距离问题

任务描述 现在给出你一些数&#xff0c;要求你写出一个程序&#xff0c;输出这些整数相邻最近的素数&#xff0c;并输出其相距长度。如果左右有等距离长度素数&#xff0c;则输出左侧的值及相应距离。 如果输入的整数本身就是素数&#xff0c;则输出该素数本身&#xff0c;距离…

【MySQL】13. 索引(重点)

1. 没有索引&#xff0c;可能会有什么问题 索引&#xff1a;提高数据库的性能&#xff0c;索引是物美价廉的东西了。 不用加内存&#xff0c;不用改程序&#xff0c;不用调sql&#xff0c;只要执行正确的 create index &#xff0c;查询速度就可能提高成百上千倍。 但是天下没…

基于单片机防丢失设备的设计和实践

摘要:防止老人或者小孩走丢走失,还可以放在汽车里,利用GPS系统,设计实现了基于单片机的防丢失设备。设备利用液晶显示屏显示信息,并实时发送位置短信到手机传输当前位置的纬度和经度坐标,实现了定位与监测功能。测试结果表明,利用该设备和手机可以同时观察老人或小孩携带…

【Java程序设计】【C00381】基于(JavaWeb)Springboot的爱心商城管理系统(有论文)

【C00381】基于&#xff08;JavaWeb&#xff09;Springboot的爱心商城管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#x…

【Linux】详解进程终止进程等待

一、页表&&写时拷贝的进一步理解 页表中不仅仅只有虚拟地址到物理地址的映射&#xff0c;还包括了很多选项&#xff0c;其中就包括了映射条目的权限。当我们进程的代码和数据加载到内存并和进程地址空间建立映射关系时&#xff0c;如果数据的内容不允许被修改&#xff…

第九节HarmonyOS 常用基础组件31-Toggle

1、描述 组件提供勾选框样式、状态栏样式以及开关样式。 2、子组件 仅当ToggleType为Button时可包含子组件。 3、接口 Toggle(options: { type: ToggleType , isOn?: boolean}) 4、参数 参数名 参数类型 必填 描述 type ToggleType 是 开关的样式。 isOn boole…

一款比 K8S 更好用的编排工具——Nomod 单机部署

上下文 最近公司需要调研类似 EMCHub 这样支持算力共享的服务。第一直觉是使用 K8S 或 K3S&#xff0c;作为 CNCF 孵化的顶级项目&#xff0c;同时也是当前云原生生态使用最广的编排系统。但是在学习 EMC Hub 源码过程中&#xff0c;偶然发现它是基于 Nomad 做的集群管理。 相…

介绍部署esxi8.0产品的方式

什么是esxi esxi的中文叫裸机虚拟机管理器 ESXi是由VMware公司开发的一种裸机虚拟机管理器&#xff0c;全称为VMware ESXi。 ESXi是一种虚拟化技术&#xff0c;专门设计用于在物理服务器上运行虚拟机&#xff0c;它的主要特点是能够最大限度地降低硬件配置要求并简化部署过程…

systemd-journal(三)之systemd.journal-fields

文章目录 写在前面概述用户日志字段&#xff08;User Journal Fields&#xff09;MESSAGEMESSAGE_IDPRIORITYCODE_FILE, CODE_LINE, CODE_FUNCERRNOINVOCATION_ID, USER_INVOCATION_IDSYSLOG_FACILITY, SYSLOG_IDENTIFIER, SYSLOG_PID, SYSLOG_TIMESTAMPDOCUMENTATIONTIDUNIT, …

成都克鲁斯机器人电路板故障维修攻略,快来了解一下!

一、克鲁斯机器人电路板维修步骤 断开电源&#xff1a;在进行电路维修前&#xff0c;务必断开机器人的电源&#xff0c;确保安全。 拆卸电路板&#xff1a;根据电路图或维修手册&#xff0c;小心拆卸故障电路板。注意记录拆卸过程中的细节&#xff0c;以便后续重新安装。 更换损…

基于javaweb(springboot+mybatis)网上家具商城项目设计和实现以及文档报告

基于javaweb(springbootmybatis)网上家具商城项目设计和实现以及文档报告 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞…