FloodFill算法【下】

news2024/11/13 10:27:04

417. 太平洋大西洋水流问题

题目链接:417. 太平洋大西洋水流问题

题目解析

题目给我们一个矩阵,这个矩阵相当于陆地,被两个洋包围,左和上代表太平洋,右和下代表大西洋。

矩阵里面的数字代表海拔,水可以从较高处流向较低处或者流向和自己海拔一样的。

题目要求出既能流向太平洋,又能流向大西洋的区域,返回坐标。

image-20240916201602434

算法原理

解法一:直接判定

遍历一个点就看是否能流入太平洋和大西洋,能的话就保存该位置。

这个方法会有很多重复的逻辑,比如说:

image-20240916201842307

解法二:正难则反

我们可以考虑洋可以反着流进哪些位置,找出交集即可

image-20240916202458462

代码实现

class Solution {
public:
    int m = 0;
    int n = 0;
    int dx[4] = {0, 0, 1, -1};
    int dy[4] = {-1, 1, 0, 0};
    vector<vector<int>> ret;

    vector<vector<int>> pacificAtlantic(vector<vector<int>>& h)
    {
        m = h.size();
        n = h[0].size();

        vector<vector<bool>> pac(m, vector<bool> (n));
        vector<vector<bool>> atl(m, vector<bool> (n));

        //pac 从第一行和第一列流入
        for(int j = 0; j < n; j++)  dfs(h, 0, j, pac);
        for(int i = 0; i < m; i++)  dfs(h, i, 0, pac);

        //atl 从最后一行和最后一列流入
        for(int j = 0; j < n; j++)  dfs(h, m-1, j, atl);
        for(int i = 0; i < m; i++)  dfs(h, i, n-1, atl);

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

    void dfs(vector<vector<int>>& h, int i, int j, vector<vector<bool>>& vis)
    {
        vis[i][j] = true;
        for(int k = 0; k < 4; k++)
        {
            int x = dx[k] + i;
            int y = dy[k] + j;
            if(x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && h[x][y] >= h[i][j])
                dfs(h, x, y, vis);
        }
    }
};

529. 扫雷游戏

题目链接:529. 扫雷游戏

题目解析

扫雷游戏规则就不多说了…

题目让我们返回点击一次之后,棋盘的结果

算法原理

读懂题目就是算法原理了,主要是把思路通过代码模拟出来

代码实现

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

    void dfs(vector<vector<char>>& board, int i, int j)
    {
        int mCount = 0;
        for(int k = 0; k < 8; k++)
        {
            int x = dx[k] + i;
            int y = dy[k] + j;
            if(x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'M')
            {
                mCount++;
            }    
        }

        if(mCount)
        {
            board[i][j] = mCount + '0';
            return;
        }
        else
        {
            board[i][j] = 'B';
            for(int k = 0; k < 8; k++)
            {
                int x = dx[k] + i;
                int y = dy[k] + j;
                if(x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'E')
                {
                    dfs(board, x, y);
                }    
            }
        }


    }
};

LCR 130. 衣橱整理

题目链接:LCR 130. 衣橱整理

题目解析

直接看图示例:

image-20240916203647114

每次向下或者向右移动,grid[i][j],假设i == 21j == 31,将它们每位分解,然后做加法(2+1) + (3+1),看是是否<=cnt即可

算法原理

(0, 0)位置进行一次深度优先遍历,统计满足要求的格子个数即可

  • 分解数位之和
  • 标记扫描过的地方

代码实现

class Solution {
public:
    int digit(int num)
    {
        int ret = 0;
        while(num)
        {
            ret += num%10;
            num /= 10;
        }
        return ret;
    }

    int cnt = 0;
    int m = 0;
    int n = 0;
    int ret = 0;
    int dx[2] = {0, 1};
    int dy[2] = {1, 0};
    bool check[100][100];
    int wardrobeFinishing(int _m, int _n, int _cnt)
    {
        cnt = _cnt;
        m = _m;
        n = _n;

        dfs(0, 0);
        return ret;
    }

    void dfs(int i, int j)
    {
        check[i][j] = true;
        ret++;
        for(int k = 0; k < 2; k++)
        {
            int x = dx[k] + i;
            int y = dy[k] + j;
            if(x < m && y < n && !check[x][y] && (digit(x)+digit(y)) <= cnt)
            {
                dfs(x, y);
            }
        }
    }
};

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

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

相关文章

STM32之FMC—扩展外部 SDRAM

文章目录 一、FMC外设介绍二、SDRAM 控制原理1、SDRAM关键参数a、容量、分区b、引脚SDRAM 使用 2、SDRAM芯片IS42S16400J3、SDRAM 控制引脚说明控制逻辑地址控制SDRAM 的存储阵列SDRAM 的命令预充电刷新 W9825G6KH&#xff1a;W9825G6KH引脚 三、STM32F429 FMC四、其他文章打开…

医学数据分析实训 项目四回归分析--预测帕金森病病情的严重程度

文章目录 项目四&#xff1a;回归分析实践目的实践平台实践内容 预测帕金森病病情的严重程度作业&#xff08;一&#xff09;数据读入及理解&#xff08;二&#xff09;数据准备&#xff08;三&#xff09;模型建立&#xff08;四&#xff09;模型预测&#xff08;五&#xff0…

神经网络通俗理解学习笔记(4) 深度生成模型VAE、GAN

深度生成模型 什么是生成式模型蒙特卡洛方法变分推断Variational Inference变分自编码器VAE生成对抗网络Generative Adversarial NetworkDiffusion 扩散模型VAE和GAN 代码实现 什么是生成式模型 判别式和生成式模型 判别式:CNN/RNN/transformer;生成式:AE/VAE/GAN 判别式模型学…

Linux:RPM软件包管理以及Yum软件包仓库

挂载光驱设备 RPM软件包管理 RPM软件包简介 区分软件名和软件包名 软件名&#xff1a;firefox 软件包名&#xff1a;firefox-52.7.0-1.el7.centos.x86_64.rpm 查询软件信息 查询软件&#xff08;参数为软件名&#xff09; ]# rpm -qa #当前系统中所有已安装的软件包 ]# r…

Unity实战案例全解析 :PVZ 植物脚本分析

植物都继承了Pants脚本&#xff0c;但是我因为没注意听讲&#xff0c;把Pants也挂在植物上了&#xff0c;所以子类的PlantEnableUpdate和PlantDisableUpdate抢不过父类&#xff0c;无法正确触发动画&#xff0c;我还找不到哪里出了问题&#xff0c;所以就使用了携程加while强行…

Navicat使用 笔记04

Navicat调用数据库 1.创建一个自己的链接&#xff08;文件-->新建连接-->MySQL&#xff09; 进入到这个界面中&#xff1a; 【注意&#xff1a;密码是下载登录软件时设定过的】 创建一个连接完成&#xff08;通过双击激活&#xff09;。 2.在创建好的连接中创建数据库…

神经网络通俗理解学习笔记(5) 自然语言处理

自然语言处理 词嵌入和word2vec词义搜索和句意表示预训练模型Hugging Face库介绍经典NLP数据集代码案例-电影评论情感分析 词嵌入和word2vec 词嵌入是一种 将高维的数据表示映射到低维空间的方法 word embedding 是将语言中的词编码成向量便于后续的分析和处理 词嵌入和词向量…

感知器神经网络

1、原理 感知器是一种前馈人工神经网络&#xff0c;是人工神经网络中的一种典型结构。感知器具有分层结构&#xff0c;信息从输入层进入网络&#xff0c;逐层向前传递至输出层。根据感知器神经元变换函数、隐层数以及权值调整规则的不同&#xff0c;可以形成具有各种功能特点的…

宿舍管理系统的设计与实现 (含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 宿舍管理系统拥有三个角色&#xff0c;分别为系统管理员、宿舍管理员以及学生。其功能如下&#xff1a; 管理员&#xff1a;宿舍管理员管理、学生管理、宿舍楼管理、缺勤记录管理、个人密…

django学习入门系列之第十点《A 案例: 员工管理系统8》

文章目录 10.6 重写样式10.7 判断数据是否合法10.8 保存内容至数据库10.9 修改入职时间10.10 错误提示10.11 重写错误信息往期回顾 10.6 重写样式 注意&#xff1a;因为他框架都已经给你写好了&#xff0c;所以如果要使用样式的话可能要自己重新定义框架来进行修改 他有两种方…

衣食住行的投资与消费

机器人工程课程与科研采取敏捷开发的弊端和反思_工业机器人适合敏捷开发吗-CSDN博客 →学历消费者←自我救赎↑2024↓(*Φ皿Φ*)-CSDN博客 大部分衣食住行相关的产品都是消费品&#xff0c;只有极少部分是能保值的资产。 物以稀为贵&#xff0c;量产供应的一般而言都是消费品…

第二百三十五节 JPA教程 - JPA Lob列示例

JPA教程 - JPA Lob列示例 以下代码显示了如何使用Lob注释将字节数组保存到数据库。 LOB在数据库中有两种类型&#xff1a;字符大对象&#xff08;称为CLOB&#xff09;和二进制大对象&#xff08;或BLOB&#xff09;。 CLOB列保存大字符序列&#xff0c;BLOB列可存储大字节序…

JDK的选择安装和下载

搭建Java开发环境 要使用Java首先必须搭建Java的开发环境&#xff1b;Java的产品叫JDK&#xff08;Java Development Kit&#xff1a;Java开发工具包&#xff09;&#xff0c;必须安装JDK才能使用Java。 JDK发展史 那么这么多JDK&#xff0c;应该使用哪个版本&#xff0c;此处…

C# 比较对象新思路,利用反射技术打造更灵活的比较工具

前言 嘿&#xff0c;大家好&#xff01;如果你之前看过我分享的文章《C# 7个方法比较两个对象是否相等》&#xff0c;你可能会意识到对象比较在实际业务中经常出现的场景。今天&#xff0c;我想继续与大家分享一个在实际项目中遇到的问题。 有一次&#xff0c;我接手了一个别…

LLVM PASS-PWN-前置

文章目录 参考环境搭建基础知识![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/dced705dcbb045ceb8df2237c9b0fd71.png)LLVM IR实例1. **.ll 格式&#xff08;人类可读的文本格式&#xff09;**2. **.bc 格式&#xff08;二进制格式&#xff09;**3. **内存表示** …

无心剑英译张九龄《望月怀远》

望月怀远 Watching the Moon and Missing You Far Away 张九龄 By Zhang Jiuling 海上生明月&#xff0c;天涯共此时 情人怨遥夜&#xff0c;竟夕起相思 灭烛怜光满&#xff0c;披衣觉露滋 不堪盈手赠&#xff0c;还寝梦佳期 The bright moon rises from the sea, So far apart…

【宠物小精灵之收服(待更新)】

题目 代码 #include <bits/stdc.h> using namespace std; int f[1010][510]; int main() {int n, m, k;cin >> n >> m >> k;int c 0;for(int i 1; i < k; i){int cost, hp;cin >> cost >> hp;for(int j n; j > cost; j--){for(i…

java技术栈介绍

Java技术栈是一个庞大而丰富的生态系统&#xff0c;它包含了从基础语言特性到高级框架、库和工具的整个集合。这个技术栈为开发者提供了构建各种类型应用&#xff08;包括企业级应用、Web应用、移动应用、大数据应用等&#xff09;所需的全部组件。以下是对Java技术栈的一个更详…

【webpack4系列】编写可维护的webpack构建配置(四)

文章目录 构建配置包设计功能模块设计和目录结构设计功能模块设计目录结构设计 使用ESLint规范构建脚本冒烟测试介绍和实际运用冒烟测试 (smoke testing)冒烟测试执行判断构建是否成功判断基本功能是否正常 单元测试和测试覆盖率测试框架编写单元测试用例单元测试接入测试覆盖率…

新发布!Streamlab X系列第二版:短视频电影直播全能主题,赋能苹果CMS

Streamlab X系列第二版强势登陆&#xff0c;专为苹果CMS设计的短视频与电影直播融合的多功能主题模板震撼首发&#xff01; 这款主题以其非凡的适应性和极致的视觉效果&#xff0c;重新定义了网站构建的边界。采用独家精心研发的框架&#xff0c;它能够无缝跨越从移动设备到超…