floodfill算法(6题)

news2025/1/31 20:27:21

本质就是找出性质相似的连通块

目录

1.图像渲染

2.岛屿数量

 3.岛屿的最大面积

4.被围绕的区域

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

6.扫雷游戏


1.图像渲染

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

我们使用深度优先遍历去遍历即可,也不需要返回值。

值得注意的有两点

1.如果起始位置的颜色和目标颜色相同,直接返回即可。

2.由于我们遍历是向上下左右遍历,因此我们进入dfs函数之前需要把初始位置颜色给改了

class Solution {
public:
    int dx[4] = {0 , 0, -1, 1};
    int dy[4] = {1 , -1 ,0 , 0};
    int m, n;
    int initcolor;
    int aimcolor;
    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {
        m = image.size();
        n = image[0].size();
        initcolor = image[sr][sc];
        aimcolor = color;
        if(image[sr][sc] != color)
        {
            image[sr][sc] = color;
            dfs(image, sr, sc);
        }
        return image;
    }
    void dfs(vector<vector<int>>& image, int x,int y)
    {
        for(int k = 0; k < 4; k++)
        {
            int i = x + dx[k];
            int j = y + dy[k];
            if(i >= 0 && i < m && j >=0 && j < n && image[i][j] == initcolor)
            {
                image[i][j] = aimcolor;
                dfs(image,i,j);
            }
        }
    }
};

2.岛屿数量

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

        算法思路都是一样的。这里我们找到一块陆地就让ret++。然后再把相连的所有陆地都标记起来,这样子下次找岛屿时就不会找到相同的地块了。并不需要恢复路径。

class Solution {
public:
    int dx[4] = {0 , 0, -1, 1};
    int dy[4] = {1 , -1 ,0 , 0};
    int m, n;
    int check[310][310];
    int ret = 0;
    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' && check[i][j] == false)
                {
                    check[i][j] = true;
                    dfs(grid, i, j);
                    ret++;
                }
            }
        }
       return ret;
    }
    void dfs(vector<vector<char>>& grid, int x, int y)
    {
        for(int k = 0; k < 4; k++)
        {
            int i = x + dx[k];
            int j = y + dy[k];
            if(i >= 0 && i < m && j >=0 && j < n && grid[i][j] == '1' && check[i][j] == false)
            {
                check[i][j] = true;
                dfs(grid,i,j);
            }
        }
    }
};

 3.岛屿的最大面积

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

        这题代码和岛屿数量几乎一样。我们要记录岛屿的面积只需要定义一个全局的count变量,每次dfs进入一块新的地之后把count++即可。每次找到一块新的未遍历的地的时候先将count清零

class Solution {
public:
    int dx[4] = {0 , 0, -1, 1};
    int dy[4] = {1 , -1 ,0 , 0};
    int m, n;
    int check[55][55];
    int ret = 0;
    int count;
    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 && check[i][j] == false)
                {
                    count = 0;
                    check[i][j] = true;
                    dfs(grid, i, j);
                    ret = max(ret, count);
                }
            }
        }
       return ret;
    }

    void dfs(vector<vector<int>>& grid, int x, int y)
    {
        count++;
        for(int k = 0; k < 4; k++)
        {
            int i = x + dx[k];
            int j = y + dy[k];
            if(i >= 0 && i < m && j >=0 && j < n && grid[i][j] == 1 && check[i][j] == false)
            {
                check[i][j] = true;
                dfs(grid,i,j);
            }
        }
    }


};

4.被围绕的区域

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

    题目的意思是把四周都围上‘X’的'O'变成‘X’。于是给我们的图中有两种情况需要分别讨论。

    这样会非常麻烦。因此我们正难则反,遍历一遍四周,遇到‘O’时进行一次深度优先遍历就能找出所有与边缘相连的‘O’。我们先把这些O改成‘.’。

        对四周进行遍历后我们再把‘.’重新还原变成‘O’,把原来没有被改变的‘O’改成‘X’。

class Solution {
public:
    int dx[4] = {0 , 0, -1, 1};
    int dy[4] = {1 , -1 ,0 , 0};
    int m, n;
    void solve(vector<vector<char>>& board) {
        m = board.size();
        n = board[0].size();
        for(int i = 0; i < n; i++)
        {
                if(board[0][i] == 'O')dfs(board, 0, i);
                if(board[m-1][i] == 'O')dfs(board, m - 1, i);
        }
        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++)
            {
                if(board[i][j] == 'O')
                {
                    board[i][j] = 'X';
                }
                else if(board[i][j] == '.')
                {
                    board[i][j] = 'O';
                }
            }
        }
    }
    void dfs(vector<vector<char>>& board, int x, int y)
    {
        board[x][y] = '.';
        for(int k = 0; k < 4; k++)
        {
            int i = x + dx[k];
            int j = y + dy[k];
            if(i >= 0 && i < m && j >=0 && j < n && board[i][j] == 'O' )
            {
                board[i][j] = '.';
                dfs(board,i,j);
            }
        }
    }

};

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

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

         依然也是正难则反的思路。我们从头到位遍历一次数组,每到一个位置就进行一次深度优先遍历的话复杂度太高。因此我们选择逆向,从靠近海边的位置进行逆向查找。这样每个格子被标记到之后只会被查到一次。

        这里我们开两个数组分别标记能流到大西洋和太平洋的位置。为了辨识数组这里选择传了一个标记数字。

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

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

        for(int j = 0; j < m; j++)
        {
            check2[j][n-1] = 1;
            dfs(board, j, n - 1,2);
        }
         for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (check1[i][j] && check2[i][j]) {
                    ret.push_back({i, j});
                }
            }
        }
        return ret;
    }

    void dfs(vector<vector<int>>& board, int x, int y, int z)
    {
        for(int k = 0; k < 4; k++)
        {
            int i = x + dx[k];
            int j = y + dy[k];

            
            if(i >= 0 && i < m && j >=0 && j < n && board[i][j] >= board[x][y])
            {
                if(z == 1 && check1[i][j] == false)
                {
                    
                    check1[i][j] = true;
                    dfs(board,i,j,1);
                }
                else if(z == 2 && check2[i][j] == false)
                {
                    check2[i][j] = true;
                    dfs(board,i,j,2);
                }
            }
        }
    }
};

6.扫雷游戏

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

        这题需要注意的点不多。

        第一就是某点周围有雷和无雷后续的情况是不同的,第二就是遍历的时候注意已经走过的路不用再走,即board[i][j] == 'E'时我们才继续

class Solution {
public:
    int dx[8] = {0, 0, 1, -1, 1, 1, -1, -1};
    int dy[8] = {1, -1, 0, 0, 1, -1, 1, -1};
    int m, n;
    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 x, int y)
    {
        int flag = 0;
        for(int k = 0; k < 8; k++)
        {
            int i = x + dx[k];
            int j = y + dy[k];
            if(i >= 0 && i < m && j >=0 && j < n )
            {
               if(board[i][j] == 'M')
               {
                    flag++;
               }
            }
        }
        if(flag)
        {
            board[x][y] = '0' + flag;
            return ;
        }
        else
        {
            board[x][y] = 'B';
            for(int k = 0; k < 8; k++)
            {
                int i = x + dx[k];
                int j = y + dy[k];
                if(i >= 0 && i < m && j >=0 && j < n && board[i][j] == 'E')
                {
                   dfs(board, i, j);
                }
            }
        }
    }
};

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

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

相关文章

ThinkPHP 8模型与数据的插入、更新、删除

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…

项目升级Sass版本或升级Element Plus版本遇到的问题

项目升级Sass版本或升级Element Plus版本遇到的问题 如果项目有需求需要用到高版本的Element Plus组件&#xff0c;则需要升级相对应的sass版本&#xff0c;Element 文档中有提示&#xff0c;2.8.5及以后得版本&#xff0c;sass最低支持的版本为1.79.0&#xff0c;所升级sass、…

基于OSAL的嵌入式裸机事件驱动框架——整体架构调度机制

参考B站up主【架构分析】嵌入式祼机事件驱动框架 感谢大佬分享 任务ID &#xff1a; TASK_XXX TASK_XXX 在系统中每个任务的ID是唯一的&#xff0c;范围是 0 to 0xFFFE&#xff0c;0xFFFF保留为SYS_TSK_INIT。 同时任务ID的大小也充当任务调度的优先级&#xff0c;ID越大&#…

Three.js 后期处理(Post-Processing)详解

目录 前言 一、什么是后期处理&#xff1f; 二、Three.js 后期处理的工作流程 2.1 创建 EffectComposer 2.2 添加渲染通道&#xff08;Render Pass&#xff09; 2.3 应用最终渲染 三、后期处理实现示例 3.1 基础代码 四、常见的后期处理效果 4.1 辉光效果&#xf…

HTML特殊符号的使用示例

目录 一、基本特殊符号的使用 1、空格符号&#xff1a; 2、小于号 和 大于号&#xff1a; 3、引号&#xff1a; 二、版权、注册商标符号的使用 1、版权符号&#xff1a;© 2、注册商标符号&#xff1a; 三、数学符号的使用 四、箭头符号的使用 五、货币符号的使用…

JAVA实战开源项目:在线文档管理系统(Vue+SpringBoot) 附源码

本文项目编号 T 038 &#xff0c;文末自助获取源码 \color{red}{T038&#xff0c;文末自助获取源码} T038&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

快速分析LabVIEW主要特征进行判断

在LabVIEW中&#xff0c;快速分析程序特征进行判断是提升开发效率和减少调试时间的重要技巧。本文将介绍如何高效地识别和分析程序的关键特征&#xff0c;从而帮助开发者在编写和优化程序时做出及时的判断&#xff0c;避免不必要的错误。 ​ 数据流和并行性分析 LabVIEW的图形…

UE学习日志#15 C++笔记#1 基础复习

1.C20的import 看看梦开始的地方&#xff1a; import <iostream>;int main() {std::cout << "Hello World!\n"; } 经过不仔细观察发现梦开始的好像不太一样&#xff0c;这个import是C20的模块特性 如果是在VS里编写的话&#xff0c;要用这个功能需要新…

Deep Seek R1本地化部署

目录 说明 一、下载ollama 二、在ollama官网下载模型 三、使用 后记 说明 操作系统&#xff1a;win10 使用工具&#xff1a;ollama 一、下载ollama 从官网下载ollama&#xff1a; ollama默认安装在C盘&#xff0c;具体位置为C:\Users\用户名\AppData\Local\Programs\O…

C# Winform制作一个登录系统

using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 登录 {p…

动态规划DP 最长上升子序列模型 总览

最长上升子序列模型 1. 最长上升子序列 1.1 怪盗基德的滑翔伞 1.1.1 登山 1.1.2 合唱队形 1.2 友好城市 1.3 最长上升子序列和 1.4 导弹拦截

怎样在PPT中启用演讲者视图功能?

怎样在PPT中启用演讲者视图功能&#xff1f; 如果你曾经参加过重要的会议或者演讲&#xff0c;你就会知道&#xff0c;演讲者视图&#xff08;Presenter View&#xff09;对PPT展示至关重要。它不仅能帮助演讲者更好地掌控演讲节奏&#xff0c;还能提供额外的提示和支持&#…

论文阅读(七):贝叶斯因果表型网络解释遗传变异和生物学知识

1.论文链接&#xff1a;Bayesian Causal Phenotype Network Incorporating Genetic Variation and Biological Knowledge 摘要&#xff1a; 在分离群体中&#xff0c;数量性状基因座&#xff08;QTL&#xff09;定位可以确定对表型有因果效应的QTL。这些方法的一个共同特点是Q…

1.27补题 回训练营

E 智乃的小球 题目描述 在一条无限长的水平直线上&#xff0c;有 n 个小球&#xff0c;每个小球的质量相同&#xff0c;体积可以忽略不计。这些小球初始时位于直线上的不同位置&#xff0c;并且每个小球有一个初始速度&#xff0c;速度为 -1 m/s 或 1 m/s。速度为 -1 m/s 表示…

INCOSE需求编写指南-附录 B: 首字母缩略词和缩写

附录 Appendix B: 首字母缩略词和缩写ACRONYMS AND ABBREVIATIONS AD 难易程度的进阶 Advancement Degree of Difficulty AI 人工智能 Artificial Intelligence CM 配置管理 Configuration Management ConOps 运作理念 Concept of Operations COTS 商业现货 Comme…

B站吴恩达机器学习笔记

机器学习视频地址&#xff1a; 4.5 线性回归中的梯度下降_哔哩哔哩_bilibili 损失函数学习地址&#xff1a; 损失函数选择 选凸函数的话&#xff0c;会收敛到全局最小值。证明凸函数用Hessian矩阵。凸函数定义&#xff1a;两点连线比线上所有点都大。 batch理解&#xff1…

Vscode编辑器下 Markdown无法显示图片

1.问题 在vscode 编辑器中无法预览 markdon 文件中的图片 2.解决方案 大部分出现这种情况是因为新版本的vscode会阻拦有风险的资源显示&#xff0c;将安全等级调低即可。 方式一&#xff1a; 1.打开任意 MD 文件&#xff0c;ctrl&#xff0c;调出设置 2. 输入 markdown.ch…

mysql重学(一)mysql语句执行流程

思考 一条查询语句如何执行&#xff1f;mysql语句中若列不存在&#xff0c;则在哪个阶段报错一条更新语句如何执行&#xff1f;redolog和binlog的区别&#xff1f;为什么要引入WAL什么是Changbuf&#xff1f;如何工作写缓冲一定好吗&#xff1f;什么情况会引发刷脏页删除语句会…

国产650V碳化硅MOSFET在通信电源应用中全面取代超结MOSFET

在通信电源应用中&#xff0c;国产650V碳化硅&#xff08;SiC&#xff09;MOSFET全面取代超结MOSFET&#xff08;如硅基CoolMOS&#xff09;&#xff0c;是技术迭代、政策推动、市场需求和国产产业链成熟共同作用的结果。倾佳电子杨茜从以下多个维度解析这一趋势&#xff1a; 倾…

【ComfyUI专栏】通过软件获取PNG图片中的工作流信息

自从AI生成图片技术发展之后,你会发现很有意思的情况就是所有的图片中开始包含利用AI生成的工作流。有的时候你直接将图片拖到ComfyUI来获取图片中的工作流。下面的图片中的信息很意外的没有包含工作流,但那时我们可以看到的Parameters里面包含了设置之外,也有工作流节点内容…