当前位置: 首页 > article >正文

FloodFill算法【下】

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.kler.cn/news/307086.html

相关文章:

  • WGCAT工单系统可以让客户自己提交工单吗
  • Day21笔记-封装继承
  • MySQL练手题--体育馆的人流量(困难)
  • [数据集][目标检测]疟疾恶性疟原虫物种目标检测数据集VOC+YOLO格式948张1类别
  • 大学生看过来,必备4款写论文AI写作网站先稿后付
  • 《论负载均衡技术在Web系统中的应用》写作框架,软考高级系统架构设计师
  • Python网络爬虫:如何高效获取网络数据
  • vue3 透传 Attributes
  • TDengine 签约前晨汽车,解锁智能出行的无限潜力
  • 【计算机网络】网络通信中的端口号
  • Android SPN/PLMN 显示逻辑简介
  • SpringBoot框架Web开发
  • 第十一章 【后端】商品分类管理微服务(11.1)——创建父工程
  • Python 实现 LM 算法(Levenberg-Marquardt)
  • PCIe进阶之TL:First/Last DW Byte Enables Rules Traffic Class Field
  • Linux命令分享 四 (ubuntu 16.04)(vi操作文件)
  • 第十七节:学习Hutool上传文件(自学Spring boot 3.x的第四天)
  • C++比大小游戏
  • 虚幻引擎Gameplay探索 Actor 之间的高效通信与交互技巧一
  • 鹏哥C语言39---goto语句(关机程序 )
  • UE4_后期处理六—复古电视效果
  • 【HCIA-Datacom】华为VRP系统
  • 利用Leaflet.js创建交互式地图:绘制固定尺寸的长方形
  • uniapp uni-table合并单元格
  • .SUFFIXES:
  • openGemini 社区人才培养计划:助力成长,培养新一代云原生数据库人才
  • Redis面试题整理
  • 信息学奥赛:青少年编程的高光舞台,通向未来科技的敲门砖
  • 冒泡,选择,快速-排序
  • nestjs cache manager 很ioredis配合使用方案