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

news2024/11/26 1:56:50

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);
            }
        }
    }
};

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

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

相关文章

AI视频教程下载-与ChatGPT结合的UX用户体验/UI用户界面设计策略

Revolutionize UX_UI_ AI-Design Strategies with ChatGPT 提升你的设计工具包&#xff1a;使用ChatGPT、Figma和Miro的AI驱动UX/UI策略 50个创新UX提示 了解人工智能的基础知识。介绍ChatGPT及其底层技术。区分不同AI模型及其在设计中的应用。将AI工具融入设计工作流程的策略…

摄像头画面显示于unity场景

&#x1f43e; 个人主页 &#x1f43e; &#x1faa7;阿松爱睡觉&#xff0c;横竖醒不来 &#x1f3c5;你可以不屠龙&#xff0c;但不能不磨剑&#x1f5e1; 目录 一、前言二、UI画面三、显示于场景四、结语 一、前言 由于标题限制&#xff0c;这篇文章主要是讲在unity中调用摄…

动手学深度学习(Pytorch版)代码实践 -卷积神经网络-28批量规范化

28批量规范化 """可持续加速深层网络的收敛速度""" import torch from torch import nn import liliPytorch as lp import matplotlib.pyplot as pltdef batch_norm(X, gamma, beta, moving_mean, moving_var, eps, momentum):""&quo…

ultralytics官方更新 | 添加YOLOv10到ultralytics

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a;《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有40篇内容&#xff0c;内含各种Head检测头、损失函数Loss、…

【idea-jdk1.8】使用Spring Initializr 创建 Spring Boot项目没有JDK8

信息差真可怕&#xff01; 很久没创建springboot项目&#xff0c;今天使用idea的Spring Initializr 创建 Spring Boot项目时&#xff0c;发现java版本里&#xff0c;无法选择jdk1.8&#xff0c;只有17、21、22&#xff1b;前段时间也听说过&#xff0c;springboot将放弃java8&a…

【深度学习驱动流体力学】计算流体力学openfoam-paraview与python3交互

目的1:配置 ParaView 中的 Python Shell 和 Python 交互环境 ParaView 提供了强大的 Python 接口,允许用户通过 Python 脚本来控制和操作其可视化功能。在 ParaView 中,可以通过 View > Python Shell 菜单打开 Python Shell 窗口,用于执行 Python 代码。要确保正确配置 …

GitLab配置免密登录之后仍然需要Git登录的解决办法

GitLab配置免密登录之后仍然需要Git登录的解决办法 因为实习工作需要&#xff0c;要在本地拉取gitlab上的代码&#xff0c;设置了密钥之后连接的时候还需要登录的token&#xff0c;摸索之后有了下面的解决办法。 方法一&#xff1a; 根据报错的提示&#xff0c;去网站上设置个人…

加速鸿蒙生态共建,蚂蚁mPaaS助力鸿蒙原生应用开发创新

6月21日-23日&#xff0c;2024华为开发者大会&#xff08;HDC 2024&#xff09;如期举行。在22日的【鸿蒙生态伙伴SDK】分论坛中&#xff0c;正式发布了【鸿蒙生态伙伴SDK市场】&#xff0c;其中蚂蚁数科旗下移动开发平台mPaaS&#xff08;以下简称&#xff1a;蚂蚁mPaaS&#…

How to use ModelSim

How to use ModelSim These are all written by a robot Remember, you can only simulate tb files.

SD卡无法读取?原因分析与数据恢复策略

一、SD卡无法读取的困境 SD卡作为便携式的存储介质&#xff0c;广泛应用于手机、相机、平板等多种电子设备中。然而&#xff0c;在使用过程中&#xff0c;我们可能会遭遇SD卡无法读取的困扰。当我们将SD卡插入设备时&#xff0c;设备无法识别SD卡&#xff0c;或者虽然识别了SD…

学习使用js和jquery修改css路径,实现html页面主题切换功能

学习使用js和jquery修改css路径&#xff0c;实现html页面主题切换功能 效果图html代码jquery切换css关键代码js切换css关键代码 效果图 html代码 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>修改css路径</title&g…

通俗解释resultType和resultMap的区别

【 1 对于单表而言&#xff1a; 注&#xff1a;以下都是摘抄过来的&#xff0c;做了让自己更能理解的版本 如果数据库返回结果的列名和要封装的实体的属性名完全一致的话用 resultType 属性 如果数据库返回结果的列名&#xff08;起了别名&#xff09;和要封装的实体的属性名…

PHP题目

一.编写函数change($str)实现字符串转换功能&#xff0c;例如“str_replace”转换成“str%replace”、“arr_var”转换成“arr%var”。 <?php function change($str){$astr_replace(_,%,$str);return $a; } echo change(str_replace); ?> 运行结果&#xff1a; 二.通…

spring-依赖注入DI

Setter注入&#xff1a; 1、引用类型&#xff1a;在bean中定义引用类型属性并提供可访问的set方法&#xff0c;配置中使用property标签ref属性注入引用类型对象&#xff1b; 2、简单类型&#xff1a;在bean中定义引用类型属性并提供可访问的set方法&#xff0c;在配置中使用pr…

NavicatforMySQL11.0软件下载-NavicatMySQL11最新版下载附件详细安装步骤

我们必须承认Navicat for MySQL 支援 Unicode&#xff0c;以及本地或远程 MySQL 服务器多连线&#xff0c;使用者可浏览数据库、建立和删除数据库、编辑数据、建立或执行 SQL queries、管理使用者权限&#xff08;安全设定&#xff09;、将数据库备份/复原、汇入/汇出数据&…

md5在ida中的识别

ida中 识别md5 ,先右键转为hex 或者按h _DWORD *__fastcall MD5Init(_DWORD *result) {*result 0;result[1] 0;result[2] 1732584193;result[3] -271733879;result[4] -1732584194;result[5] 271733878;return result; }在ida中当然也可以使用搜索 search imdate-value …

分布式系统的演化(单机架构/应用符合和存储服务分离架构/应用服务集群架构/主从分离架构/冷热分离架构)

文章目录 单机架构应用服务和存储服务分离应用服务集群架构读写分离/主从分离架构冷热分离架构--引入缓存分库分表 单机架构 单机架构只有一台服务器&#xff0c;使用一台服务器负责所有的工作 举个例子&#xff1a;假设有以下电商网站&#xff0c;商品、用户、交易等功能服务…

实验六:三维图形修改器的综合应用

如果文章有写的不准确或需要改进的地方&#xff0c;还请各位大佬不吝赐教&#x1f49e;&#x1f49e;&#x1f49e;。朱七在此先感谢大家了。&#x1f618;&#x1f618;&#x1f618; &#x1f3e0;个人主页&#xff1a;语雀个人知识库 &#x1f9d1;个人简介&#xff1a;大家…

【STM32-启动文件 startup_stm32f103xe.s】

STM32-启动文件 startup_stm32f103xe.s ■ STM32-启动文件■ STM32-启动文件主要做了以下工作&#xff1a;■ STM32-启动文件指令■ STM32-启动文件代码详解■ 栈空间的开辟■ 栈空间大小 Stack_Size■ .map 文件的详细介绍■ 打开map文件 ■ 堆空间■ PRESERVE8 和 THUMB 指令…