【递归、搜索与回溯】floodfill算法一

floodfill算法一

  • 1.floodfill算法简介
  • 2.图像渲染
  • 3.岛屿数量
  • 4.岛屿的最大面积

在这里插入图片描述

点赞👍👍收藏🌟🌟关注💖💖
你的支持是对我最大的鼓励,我们一起努力吧!😃😃

1.floodfill算法简介

floodfill算法又叫洪水灌溉或者洪水淹没啥的,这个算法

比如有一个区域,负数表示低谷,0表示平原,正数表示山峰。此时发大水把这些区域淹了。其中平原和山峰可能不会改变,但是低谷水位就要上升。这种类型题目就是,我们要在这个区域中找出水位会上升的区域或者说找到会被洪水淹的区域。其实这道题说白了就是性质相同的一个连通块 找出来。

比如这里就是把所有是负数的连通块找到,注意只能上下左右相连,斜着不能连!

在这里插入图片描述

floodfill算法解决的问题就这么简单,它解决方法也非常简单,可以用深度优先遍历和宽度优先遍历。dfs就是一条路走到黑,如果无法走就回溯到上一层,然后能走就继续走,直到走到一个不能走的位置。此时就把一个连通区域找到了。

在这里插入图片描述
bfs从一个位置开始把和我相连的位置加入到队列里,然后继续在扩一层在扩一层…

在这里插入图片描述
因此floodfill算法有两种解决方式,要么dfs、要么bfs。你会发现这个dfs和我们前面单词搜索,黄金矿工解法非常相似,到一个位置之后就上下左右扫描,当和我性质相同就递归进去。这里主要用的是dfs。bfs在优先算法里面,本质其实就是暴搜。

2.图像渲染

题目连接:733. 图像渲染

题目分析:

在这里插入图片描述
题目说这么多,其实就是给一个矩阵,在给一个初始的坐标,然后把和这小格性质相同的连通块找到然后变成newcolor。注意只能上下左右去找!

在这里插入图片描述
算法原理:

有我们之前做那么多题基础,这里不应该是问题。我们只是简单把过程说一下。其他都是差不多。这里我们只用进行一次深度优先遍历就可以了。以初始位置为起点开始上下左右扫描,当我扫描到和我相同的像素值的时候我就递归进去,但是在递归进去之前先要把我当前位置的值改成newcolor。如果递归到某个位置它上下左右都走不了就回溯。然后如果能走就继续递归下去。直到把这次性质相同的连通块走完。

有一个细节问题,如果newcolor就等于给我们初始位置值,如 newcolor=1,那我们刚才的策略就有问题了。因为上下左右递归的时候可能会回到上一次递归,就会造成死递归。当原始的值和要修改的值相同的话,我们要把这个情况特殊出来一下。无需修改直接返回即可!

在这里插入图片描述

class Solution 
{
    int dx[4]={0,0,1,-1};
    int dy[4]={1,-1,0,0};
    int m,n;
    int prev;
public:
    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) 
    {       
            if(image[sr][sc] == color)  return image;

            m=image.size(),n=image[0].size();
            prev=image[sr][sc];
            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);
            }
        }
    }
};

3.岛屿数量

题目链接:200. 岛屿数量

题目分析

在这里插入图片描述
这道题让找到由陆地构成的岛屿的数量,也就是让找到性质相同的连通块数量。注意只能上下左右找。1代表陆地,0代表水域。

算法原理:
我们一行一行扫描扫描到第一个1的时候,我就把以这个1相连的所有为1的区域都标记一下,相当于找到了一块岛屿记录一下。接下来继续扫描。但是有可能会碰到重复的情况,因此这里需要一个bool类型的数组 标记当前位置是否被找过。或者可以修改原始值把它由1变成0。这里我们还用的是老方法bool类型数组。之前走过下一就不能在走了。

在这里插入图片描述

class Solution 
{
    //bool vis[301][301];  //感觉浪费空间就先计算一下当前需要多大空间,然后再申请空间
    vector<vector<int>> vis;
    int dx[4]={0,0,1,-1};
    int dy[4]={1,-1,0,0};
    int m,n;
public:
    int numIslands(vector<vector<char>>& grid) 
    {
        int cnt = 0;
        m = grid.size(),n = grid[0].size();
        vis=vector<vector<int>>(m,vector<int>(n));
        for(int i = 0; i < m; ++i)
        {
            for(int j = 0; j < n; ++j)
            {
                if(!vis[i][j] && grid[i][j] == '1' )
                {
                    vis[i][j]=true;
                    dfs(grid,i,j);
                    ++cnt;
                }
            }
        }
        return cnt;
    }

    void dfs(vector<vector<char>>& grid,int i,int 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 && !vis[x][y] && grid[x][y] == '1')
            {
                vis[x][y]=true;
                dfs(grid, x, y);
            }
        }
    }
};

4.岛屿的最大面积

题目链接:695. 岛屿的最大面积

题目分析:

在这里插入图片描述

上面是让找岛屿数量,这里让找岛屿面积最大,思想几乎是一模一样

算法原理:

我们用的肯定还是深度优先遍历,此时依旧是一行一行扫描,当扫描到一个陆地之后就由这个陆地开始来一次深度优先遍历,但是此时做深度优先遍历我们可以搞一个变量count 全局和参数都可以,只要进入一次dfs,就让count++。当这个深度优先遍历结束之后此时这个count就是统计这个岛屿的面积。然后让一个ret统计所有count里面的最大值,就可以把最大岛屿面积找到了。
在这里插入图片描述

class Solution 
{
    bool vis[51][51];  
    int dx[4]={0,0,1,-1};
    int dy[4]={1,-1,0,0};
    int m,n;
    int count;
public:
    int maxAreaOfIsland(vector<vector<int>>& 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(!vis[i][j] && grid[i][j] == 1)
                {
                    count=0;//每次进来先恢复一下最开始面积数
                    dfs(grid,i,j);
                    ret=max(ret,count);
                }
            }
        }
        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 && !vis[x][y] && grid[x][y] == 1)
            {
                dfs(grid, x, y);
            }
        }
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

测试:设计测试用例

文章目录 概念设计正交法判定表法 本篇总结的是测试用例的概念和设计方法 概念 测试用例是为了实施测试而向被测试的系统提供的一组集合&#xff0c;这个集合中包含的内容有测试环境&#xff0c;操作步骤&#xff0c;测试数据&#xff0c;预期结果等要素 在测试用例的设计中…

MySQL:JDBC详解!

文章目录 &#x1f4d1;JDBC简介&#x1f4d1;通过代码使用JDBC的API☁️结语 &#x1f4d1;JDBC简介 实际上在工作中&#xff0c;针对数据库的操作&#xff0c;很少会直接通过命令行/图形化客户端来操作数据库&#xff0c;更多的是通过代码&#xff08;C、Java、Python、GO……

基于simulink的PEM燃料电池控制系统建模与仿真,对比PID,积分分离以及滑模控制器

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 PID控制器 4.2 积分分离PID控制器 4.3 滑模控制器 5.完整工程文件 1.课题概述 基于simulink的PEM燃料电池控制系统建模与仿真,对比PID,积分分离以及滑模控制器。 2.系统仿真结果 &#xff08;完…

qt开发-10_LineEdit

QLineEdit 小部件是一个单行文本编辑器。行编辑允许用户使用一组有用的编辑函数输入和 编辑一行纯文本。包括撤消和重做、剪切和粘贴以及拖放。通过更改行编辑的 echoMode()&#xff0c;它 还可以用作“只写”字段&#xff0c;用于输入如密码等. 创建好项目后&#xff0c;进入 …

热重启(硬重启)获取Bitlocker密钥取证

计算机内存&#xff08;条&#xff09;在系统运行时存储了大量敏感信息&#xff0c;当断电后&#xff0c;内存中的数据荡然无存。反之&#xff0c;当一直通电的情况下&#xff0c;内存中的一些敏感数据一直存在。当然&#xff0c;正如某些人了解的&#xff0c;当断电后&#xf…

NeRF从入门到放弃5: Neurad代码实现细节

Talk is cheap, show me the code。 CNN Decoder 如patch设置为32x32,patch_scale设置为3&#xff0c;则先在原图上采样96x96大小的像素块&#xff0c;然后每隔三个取一个像素&#xff0c;降采样成32x32的块。 用这32x32个像素render feature&#xff0c;再经过CNN反卷积预测…

高考填报志愿(选专业),怎样找准自己的兴趣?

在很多的高考报考指南中&#xff0c;第一要点&#xff0c;都会建议我们根据自己的兴趣来选择自己的专业。很多人虽然是依据这条规则&#xff0c;选择了自己大学的专业。却依然在学习的过程中发现&#xff0c;好像自己对这个专业并不是那么的有兴趣。 甚至对专业学习深入了解之…

MySQL数据库笔记(二)

第一章 单行函数 1.1 什么是函数 函数的作用是把我们经常使用的代码封装起来,需要的时候直接调用即可。这样既提高了代码效率,又提高了可维护性。在SQL中使用函数,极大地提高了用户对数据库的管理效率。 1.2 定义 操作数据对象。 接受参数返回一个结果。 只对一行进行…

探索计算机视觉(人工智能重要分支)的发展与应用

引言 在当今快速发展的科技时代&#xff0c;计算机视觉作为人工智能领域的重要分支&#xff0c;正日益成为各行各业不可或缺的关键技术。从简单的图像处理到复杂的智能系统&#xff0c;计算机视觉的发展不仅改变了我们看待世界的方式&#xff0c;也深刻影响着工业、医疗、交通等…

不同交换机之间相同VLAN间主机通信

1、搭建网络拓扑 搭建拓扑&#xff0c;分配IP地址&#xff0c;划分vlan&#xff0c;分配端口 2、配置交换机 //进入全局配置模式 Switch>enable Switch#config terminal Enter configuration commands, one per line. End with CNTL/Z. Switch(config)#hostname SW1 …

如何级联移位寄存器(74HC595)

在这个项目中&#xff0c;我们将使用 74HC595 移位寄存器将 2 个移位寄存器级联在一起。这样级联移位寄存器现在可以控制 16 个输出。 当然您可以级联任意数量的移位寄存器。如果您要级联第三个移位寄存器&#xff0c;它可以控制 24 个输出。如果您级联第四个移位寄存器&#x…

Rxjava2最全面的解析

说到区别&#xff0c;可能有的小伙伴会问&#xff0c;我没看过rxjava1。可以直接看rxjava2么。个人觉得不必要&#xff0c;因为 rxjava2.x 是按照 Reactive-Streams specification 规范完全的重写的&#xff0c;完全独立于 rxjava1.x 而存在&#xff0c;它改变了以往 rxjava1的…

1999-2022年 297个地级市-医院卫生院数量及床位数量(数据收集)

全国297个地级市的医院卫生院数量的稳步增长是医疗事业发展的一个重要标志。政府的持续投入和对医疗设施的改善&#xff0c;不仅提升了医疗服务的硬件水平&#xff0c;也通过引进和培养医疗人才、优化服务流程&#xff0c;提高了医疗服务的整体质量。这些举措极大地增强了人民群…

WordPress项目教程:自动采集并发布,让你轻松实现网站内容更新

随着互联网的发展&#xff0c;越来越多的人开始关注自己的个人网站&#xff0c;通过网站展示自己的才华、分享知识、推广产品等。然而&#xff0c;个人网站的运营并非易事&#xff0c;尤其是内容更新方面。为了解决这个问题&#xff0c;今天我们将为大家推荐一款WordPress插件主…

测试辅助工具(抓包工具)的使用3 之 弱网测试

1.为什么要进行弱网测试&#xff1f; 1.带宽1M和带宽100M打开tpshop网站效果一样吗&#xff1f; 2.手机使用2G网络和使用3G网络打开京东的效果一样吗&#xff1f; 弱网环境下&#xff0c;出现丢包、延时软件的处理机制&#xff0c;避免造成用户的流失。 2.如何进行弱网测试&…

记一道MO数学练习题

手玩发现&#xff0c; 要么是行共线&#xff0c; 也就是说&#xff08;1,1&#xff09;填1之后&#xff0c;&#xff08;1,4&#xff09;要填1&#xff0c;&#xff08;1,7&#xff09;要填1&#xff0c; 事实上&#xff0c;可以给&#xff08;1&#xff0c;x&#xff09;&a…

YOLOv10目标检测算法的使用

目录 一、环境安装 1、创建虚拟环境 2、安装依赖 二、数据集准备 1、预训练权重 2、数据划分 3、建立数据集的yaml文件 三、训练 1、终端运行指令 2、建立一个 python 文件运行 四、验证 1、终端运行指令 2、建立一个 python 文件运行 五、模型推理 1、单张图片推…

AtCoder Beginner Contest 359(ABCDEFG题)视频讲解

A - Count Takahashi Problem Statement You are given N N N strings. The i i i-th string S i S_i Si​ ( 1 ≤ i ≤ N ) (1 \leq i \leq N) (1≤i≤N) is either Takahashi or Aoki. How many i i i are there such that S i S_i Si​ is equal to Takahashi? C…

基于IDEA的Maven(坐标信息介绍和编写)

这篇博客来学习和分析一下&#xff1a; " pom.xml " 所生成的最基本的信息。 之前的博客中讲到&#xff0c;学 Maven 就是学 " pom.xml " 的配置。后面也会围绕这个文件进行学习。 目录 一、分析 pom.xml 文件 &#xff08;1&#xff09;分析的 "p…

YOLOv9基础 | 实时目标检测新SOTA,手把手带你深度解析yolov9论文!

前言:Hello大家好,我是小哥谈。YOLOv9是Chien-Yao Wang等人提出的YOLO系列的最新版本之一(截止到目前,YOLOv10已发布),于2024年2月21日发布。它是 YOLOv7的改进版本,两者均由Chien-Yao Wang及其同事开发。本节课就以YOLOv9论文为基础带大家深入解析YOLOv9算法。🌈 …