一“填”到底:深入理解Flood Fill算法

news2024/10/5 15:12:46

✨✨✨学习的道路很枯燥,希望我们能并肩走下来!

文章目录

目录

文章目录

前言

一  floodfill算法是什么?

二  相关OJ题练习

2.1  图像渲染 

 2.2  岛屿数量

 2.3  岛屿的最大面积

2.4   被围绕的区域

 2.5  太平洋大西洋水流问题

 2.6  扫雷游戏

 2.7  衣橱整理(原:面试题 13. 机器人的运动范围 )

总结


前言

本篇详细介绍了进一步介绍floodfill算法,让使用者对floodfill算法有更加深刻的认知,而不是仅仅停留在表面,更好的模拟,为了更好的使用. 文章可能出现错误,如有请在评论区指正,让我们一起交流,共同进步!


一  floodfill算法是什么?

洪水填充(也称为种子填充)是一种算法,用于确定连接到多维数组中给定节点的区域。

可以用dfs或者bfs来作为基础,我们这里用DFS

 floodfill的本质是搜索找到性质相同的一个连通块(区域)

二  相关OJ题练习

2.1  图像渲染 

733. 图像渲染 - 力扣(LeetCode)

 

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

 2.2  岛屿数量

200. 岛屿数量 - 力扣(LeetCode)

 

class Solution {
    int dx[4] = {0,0,1,-1};
    int dy[4] = {1,-1,0,0};
    int ret,m,n;
    bool vis[301][301];
public:
    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])
                {
                    dfs(grid,i,j);
                    ret++;
                }
            }
        }
        return ret;
    }

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

 2.3  岛屿的最大面积

695. 岛屿的最大面积 - 力扣(LeetCode)

class Solution {
    int dx[4] = {0,0,1,-1};
    int dy[4] = {1,-1,0,0};
    int ret,m,n,count;
    bool vis[51][51];
public:
    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])
                {
                    dfs(grid,i,j);
                    ret = max(ret,count);
                    count = 0;
                }
            }
        }
        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 && grid[x][y] == 1 && !vis[x][y])
            {
                dfs(grid,x,y);
            }
        }
    }
};

2.4   被围绕的区域

130. 被围绕的区域 - 力扣(LeetCode)

 逆转思维,直接从边界进行DFS,将符合条件的改成‘.’,在遍历一遍

class Solution {
    int dx[4] = {1,-1,0,0};
    int dy[4] = {0,0,-1,1};
    int m,n;
public:
    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')  dfs(board,0,j);
            if(board[m-1][j] == 'O')    dfs(board,m-1,j);
        }

        for(int i = 0;i<m;i++)
        {
            if(board[i][0] == 'O')  dfs(board,i,0);
            if(board[i][n-1] == 'O')   dfs(board,i,n-1);
        }

        for(int i = 0;i<m;i++)
            for(int j = 0;j<n;j++)
            {
                cout<<board[i][j]<<" ";
                if(board[i][j] == '.')  board[i][j] = 'O';
                else if(board[i][j] == 'O') board[i][j] = 'X';
            }
    }

    void dfs(vector<vector<char>>& board,int i,int j)
    {
        board[i][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 && board[x][y] == 'O')
            {
                dfs(board,x,y);
            }
        }
    }
};

 2.5  太平洋大西洋水流问题

417. 太平洋大西洋水流问题 - 力扣(LeetCode)

 

class Solution {
    int dx[4] = {1,-1,0,0};
    int dy[4] = {0,0,1,-1};
    vector<vector<int>> ret;
    int m,n;
public:
    vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
        m = heights.size(),n = heights[0].size();
        vector<vector<bool>> visP(m,vector<bool>(n));
        vector<vector<bool>> visA(m,vector<bool>(n));
        for(int j = 0; j < n ;j++)
        {
            dfs(heights,0,j,visP);
            dfs(heights,m-1,j,visA);
        }
        for(int i = 0; i < m; i++)
        {
            dfs(heights,i,0,visP);
            dfs(heights,i,n-1,visA);
        }

        for(int i = 0;i < m; i++)
            for(int j = 0; j < n; j++)
            {
                if(visP[i][j] && visA[i][j])
                {
                    ret.push_back({i,j});
                }
            }
        return ret;
    }

    void dfs(vector<vector<int>>& heights,int i, int j,vector<vector<bool>>& vis)
    {
        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 && heights[x][y] >= heights[i][j] && !vis[x][y])
            {
                dfs(heights,x,y,vis);
            }
        }
    }
};

 2.6  扫雷游戏

529. 扫雷游戏 - 力扣(LeetCode)

class Solution {
    int dx[8] = {1,-1,0,0,1,1,-1,-1};
    int dy[8] = {0,0,1,-1,1,-1,1,-1};
    int m,n;
public:
    vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click)
    {
        if(board[click[0]][click[1]] == 'M')
        {
            board[click[0]][click[1]] = 'X';
            return board;
        }
        m = board.size(),n = board[0].size();
        dfs(board,click[0],click[1]);
        return board;
    }
    void dfs(vector<vector<char>>& board,int i,int j)
    {
        int count = 0;
        for(int k = 0; k < 8; k++)
        {
            int x = i + dx[k], y = j + dy[k];
            if(x >=0 && x < m && y >= 0 && y < n && board[x][y] == 'M')
            {
                count++;
            }
        }

        if(count)  //周围有地雷
        {
            board[i][j] = count + '0';
            return;
        }
        else  //周围没地雷
        {
            board[i][j] = 'B';
            for(int k = 0; k < 8; k++)
            {
                int x = i + dx[k], y = j + dy[k];
                if(x >=0 && x < m && y >= 0 && y < n && board[x][y] == 'E')
                {
                    dfs(board,x,y);
                }
            }
        }
    }
};

 2.7  衣橱整理(原:面试题 13. 机器人的运动范围

LCR 130. 衣橱整理 - 力扣(LeetCode)

class Solution {
    int ret;
    bool vis[101][101];
    int dx[4] = {0,0,1,-1};
    int dy[4] = {1,-1,0,0};
    int _m,_n,_cnt;
public:
    int wardrobeFinishing(int m, int n, int cnt) {
        _m = m,_n = n, _cnt = cnt;
        dfs(0,0);
        return ret;
    }

    void dfs(int i,int j)
    {
        ret++;
        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] && check(x,y))
            {
                dfs(x,y);
            }
        }
    }

    bool check(int i,int j)
    {
        int tmp = 0;
        while(i)
        {
            tmp += i % 10;
            i /= 10;
        }
        while(j)
        {
            tmp += j % 10;
            j /= 10;
        }
        return tmp <= _cnt;
    }
};

总结

✨✨✨各位读友,本篇分享到内容是否更好的让你理解floodfill算法,如果对你有帮助给个👍赞鼓励一下吧!!
🎉🎉🎉世上没有绝望的处境,只有对处境绝望的人。
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!

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

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

相关文章

数据科学:Data+AI驾驭数据的智慧之旅

数据科学&#xff1a;DataAI驾驭数据的智慧之旅 前言一、数据存储计算二、数据治理三、结构化数据分析四、语音分析五、视觉分析六、文本分析七、知识图谱 前言 今天想和大家深入聊聊数据科学这个充满魅力又极具挑战的领域。在当今数字化时代&#xff0c;数据如同潮水般涌来&a…

掌握这一招,轻松用Vue和ECharts打造炫酷雷达图——详细教程指南

大家好&#xff0c;今天我要分享的是如何使用ECharts来绘制雷达图。雷达图是一种常用的数据可视化工具&#xff0c;特别适合展示多个量化指标的比较&#xff0c;也可以进行多维度用户行为分析。接下来&#xff0c;我将一步步教大家如何通过ECharts来实现这一效果。效果图如下&a…

mysql事务 -- 事务的隔离性(测试实验+介绍,脏读,不可重复读,可重复度读,幻读),如何实现(RR和RC的本质区别)

目录 事务的隔离性 引入 测试 读未提交 脏读 读提交 不可重复读 属于问题吗? 例子 可重复读 幻读 串行化 原理 总结 事务的隔离性 隔离性的理解 -- mysql事务 -- 如何理解事务,四个属性,查看是否支持事务,事务操作(提交方式,事务的开始和回滚,提交),事务的隔离…

(Django)初步使用

前言 Django 是一个功能强大、架构良好、安全可靠的 Python Web 框架&#xff0c;适用于各种规模的项目开发。它的高效开发、数据库支持、安全性、良好的架构设计以及活跃的社区和丰富的文档&#xff0c;使得它成为众多开发者的首选框架。 目录 安装 应用场景 良好的架构设计…

基于单片机的智能浇花系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采样DHT11温湿度传感器检测温湿度&#xff0c;通过LCD1602显示 4*4按键矩阵可以设置温度湿度阈值&#xff0c;温度大于阈值则开启水泵&#xff0c;湿度大于阈值则开启风扇…

从零开始讲PCIe(6)——PCI-X概述

一、概述 PCI-X 在硬件和软件上与 PCI 具有向后兼容性&#xff0c;同时提供了更高的性能和效率。它使用与 PCI 相同的连接器格式&#xff0c;因此 PCI-X 设备可以插入 PCI 插槽&#xff0c;反之亦然。而且&#xff0c;PCI-X 采用相同的配置模型&#xff0c;因此在 PCI 系统上运…

Apollo9.0 Planning2.0决策规划算法代码详细解析 (4): PlanningComponent::Proc()

&#x1f31f; 面向自动驾驶规划算法工程师的专属指南 &#x1f31f; 欢迎来到《Apollo9.0 Planning2.0决策规划算法代码详细解析》专栏&#xff01;本专栏专为自动驾驶规划算法工程师量身打造&#xff0c;旨在通过深入剖析Apollo9.0开源自动驾驶软件栈中的Planning2.0模块&am…

webpack插件 --- webpack-bundle-analyzer【查看包体积】

const UglifyJsPlugin require(uglifyjs-webpack-plugin) // 清除注释 const CompressionWebpackPlugin require(compression-webpack-plugin); // 开启压缩// 是否为生产环境 const isProduction process.env.NODE_ENV production; const { BundleAnalyzerPlugin } requi…

大数据可视化分析建模论

大数据可视化分析建模论 前言大数据可视化分析建模 前言 在这个信息爆炸的时代&#xff0c;数据如同潮水般涌来&#xff0c;我们每天都在与海量的数据打交道。数据已经成为了企业决策、科研创新以及社会发展的核心要素。如何从这些纷繁复杂的数据中提取有价值的信息&#xff0…

C++多态、虚函数以及抽象类

目录 1.多态的概念 2.多态的定义及实现 2.1多态的构成条件 2.1.1实现多态还有两个必要条件 2.1.2虚函数 2.1.3虚函数的重写/覆盖 2.1.4多态场景的题目 2.1.5虚函数重写的一些其他问题 2.1.5.1协变(了解) 2.1.5.2析构函数的重写 2.1.6override和final关键字 2.…

【Java】JAVA知识总结浅析

Java是一门功能强大的编程语言&#xff0c;广泛应用于多个领域。Java的编程思想&#xff0c;包括面向过程和面向对象编程&#xff0c;Java的发展历史&#xff0c;各版本的特点&#xff0c;JVM原理&#xff0c;数据类型&#xff0c;Java SE与Java EE的区别&#xff0c;应用场景&…

《业务三板斧:定目标、抓过程、拿结果》读书笔记2

为什么要看懂“目标全景图”&#xff1f; 很多管理者在定目标时缺乏全局思维&#xff0c;“只见树木&#xff0c;不见森林”&#xff0c;导 致定出来的目标短浅&#xff0c;管理者如井底之蛙。“目标全景图”是企业的 整个目标体系&#xff0c;如图1-1所示。管理者看懂“目标全…

Pikachu- Over Permission-垂直越权

以admin 账号登陆&#xff0c;添加一个用户&#xff1b; 把添加用户的这个请求发送到 repeater&#xff1b; 退出admin&#xff0c;使用普通用户pikachu登陆&#xff1b; 只有查看权限&#xff1b; 使用pikachu 用户的认证信息&#xff0c;替换repeater处管理员创建用户请求的…

【电力系统】配电网前推后带法求电力系统潮流

摘要 在配电网潮流计算中&#xff0c;前推后带法是一种常用的算法&#xff0c;适用于径向结构配电网。本文通过详细介绍前推后带法的基本原理和计算流程&#xff0c;并结合实际实验结果展示了该方法在电力系统中的应用。实验结果表明&#xff0c;该方法在潮流计算中具有较高的…

Android Framework AMS(02)AMS启动及相关初始化5-8

该系列文章总纲链接&#xff1a;专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节主要涉及systemserver启动AMS及初始化AMS相关操作。同时由于该部分内容过多&#xff0c;因此拆成2个章节&#xff0c;本章节是第二章节&…

CSS元素显示类型

display 属性是 CSS 中最重要的属性之一&#xff0c;主要用来控制元素的布局&#xff0c;通过 display 属性您可以设置元素是否显示以及如何显示。 根据元素类型的不同&#xff0c;每个元素都有一个默认的 display 属性值&#xff0c;例如<div>默认的 display 属性值为 …

Pandas基础学习

导入 导入pandas一般是这样导入的 import pandas as pdSeries 创建 s1 pd.Series([5, 17, 3, 26, 31])注意Series的第一个字母要大写&#xff0c;表明这其实是Series类的构建函数, 返回的是Series类的实例 获得元素或者索引 单独获得元素 s1.values单独获得索引值 s…

基于springboot的校园物流管理系统(含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的校园物流管理系统1拥有两种角色 管理员&#xff1a;物流管理&#xff08;揽件、寄出&#xff09;、用户管理等 用户&#xff1a;收件、寄件、个人物流信息管理等 1.1 …

proto3语法

文章目录 字段规则消息类型定义与使用序列化写入文件hexdump工具反序列化读取文件decode命令选项enum类型设置电话类型 Any类型设置地址信息 oneof类型设置其他联系人信息 map类型添加备注信息 默认值更新消息更新规则 未知字段输出未知字段消息 option选项常用选项 本章代码仓…

Leetcode 剑指 Offer II 097.不同的子序列

题目难度: 困难 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个字符串 s 和一个字符串 t &#xff0c;计算在 s 的子序列…