floodfill算法题目

前言

大家好,我是jiantaoyab,在下面的题目中慢慢体会floodFill算法,虽然是新的算法,但是用的思想和前面的文章几乎一样,代码格式也几乎一样,但不要去背代码

图像渲染

https://leetcode.cn/problems/flood-fill/

解析

image-20240311085056178

代码

可以看到代码这部分,是不是和前面的文章的挺像的

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

岛屿数量

https://leetcode.cn/problems/number-of-islands/

解析

image-20240311101256605

代码

class Solution {
    int m, n;
    vector<vector<bool>> check;
    int dx[4]= {0, 0, 1, -1};
    int dy[4]= {1, -1, 0, 0};
public:
    void dfs(vector<vector<char>>& grid, int i, int j)
    {
        check[i][j] = true; //从i,j位置来的
        for(int d = 0; d < 4; d++)
        {
            int x = i + dx[d], y = j + dy[d];
            if((x >= 0 && x < m) && (y >= 0 && y < n)  && grid[x][y] == '1' && !check[x][y])
            {
                dfs(grid, x, y);
            }
        }
    }
    int numIslands(vector<vector<char>>& grid) {
        int m = grid.size(), n = grid[0].size();
        check = vector<vector<bool>> (m ,vector<bool>(n));
        int ret = 0;
        //把整个grid遍历一次
        for(int i = 0; i < m; i++)
        {
            for(int j = 0; j < n; j++)
            {
                //如果是一个岛屿而且是没有出现过的
                if(grid[i][j] == '1' && !check[i][j])
                {
                    ret++;
                    dfs(grid, i, j);
                }
            }
        }
        return ret;
    }
};

岛屿的最大面积

https://leetcode.cn/problems/ZL6zAn/

解析

大家看这个图就知道题目求的是什么了,比起上一题,多个统计数

image-20240311093330311

代码

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

被围绕的区域

https://leetcode.cn/problems/surrounded-regions/

解析

image-20240311105332642

代码

class Solution {
    int m, n;
    int dx[4] = {0,0,1,-1};
    int dy[4] = {1,-1,0,0};
public:
    void dfs(vector<vector<char>>& board, int i, int j)
    {
        board[i][j] = 'a';
        for(int d = 0; d < 4; d++)
        {
            int x = i + dx[d], y = j + dy[d];
            if(x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'O')
            {
                dfs(board, x, y);
            }
        }
    }
    void solve(vector<vector<char>>& board) {
        m = board.size(), n = board[0].size();
        //把左右2列边界处理了
        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);
        }
         //把上下2行边界处理了
        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++)
        {
            for(int j = 0; j < n; j++)
            {
                if(board[i][j] == 'a') board[i][j] = 'O';
                else if(board[i][j] == 'O') board[i][j] = 'X';
            }
        }
    }
};

太平洋大西洋水流问题

https://leetcode.cn/problems/pacific-atlantic-water-flow/

解析

image-20240311172851034

代码

class Solution {
    int m, n;
    int dx[4] = {1, -1, 0, 0};
    int dy[4] = {0,  0, 1, -1};
public:
    void dfs(vector<vector<int>>& heights, int i, int j, vector<vector<bool>>&check)
    {
        check[i][j] = true;
        for(int d = 0; d < 4; d++)
        {
            int x = i + dx[d], y = j + dy[d];
            if(x >= 0 && x < m && y >= 0 && y < n &&  !check[x][y] &&heights[x][y] >= heights[i][j] )
            {
                dfs(heights, x, y, check);
            }
        }
    }
    vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
        m = heights.size(), n = heights[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(heights, 0, j, pac);
        for(int i = 0; i < m; i++) dfs(heights, i, 0, pac);

         //处理alt
        for(int j = 0; j < n; j++) dfs(heights, m - 1, j, atl);
        for(int i = 0; i < m; i++) dfs(heights, i, n - 1, atl);

        vector<vector<int>> ret;
        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;
    }
};

扫雷游戏

https://leetcode.cn/problems/minesweeper/

解析

image-20240311180338853

代码

class Solution {
    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;
public:
    void dfs(vector<vector<char>>& board, int i, int j)
    {
        int count = 0; //地雷个数
        //统计地雷个数
        for(int d = 0; d < 8; d++)
        {
            int x = i + dx[d], y = j + dy[d];
            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 d = 0; d < 8; d++)
          {
            int x = i + dx[d], y = j + dy[d];
            if(x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'E')
            {
               dfs(board, x, y);
            }
           }
        }

    }
    vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) {
        m = board.size(), n = board[0].size();
        int x = click[0], y = click[1];
        //开局中地雷
        if(board[x][y] == 'M')
        {
            board[x][y] = 'X';
            return board;
        }
        dfs(board, x, y);
        return board;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

事物的传播属性

事务传播属性是Spring框架在处理事务时的一个重要概念&#xff0c;它定义了在事务方法被另一个事务方法调用时&#xff0c;如何处理事务边界的行为。这些属性是通过Spring的Transactional注解中的propagation属性来设置的。下面是几个常见的Spring事务传播属性&#xff1a; *RE…

生成式 AI:使用 Pytorch 通过 GAN 生成合成数据

导 读 生成对抗网络&#xff08;GAN&#xff09;因其生成图像的能力而变得非常受欢迎&#xff0c;而语言模型&#xff08;例如 ChatGPT&#xff09;在各个领域的使用也越来越多。这些 GAN 模型可以说是人工智能/机器学习目前主流的原因&#xff1b; 因为它向每个人&#xff0…

RK3568 xhci主控挂死问题

串口日志 rootjenet:~# [18694.115430] xhci-hcd xhci-hcd.1.auto: xHCI host not responding to stop endpoint command. [18694.125667] xhci-hcd xhci-hcd.1.auto: xHCI host controller not responding, assume dead [18694.125977] xhci-hcd xhci-hcd.1.auto: HC died; c…

微软模拟飞行器回放功能

参考b站up主&#xff0c;欢迎大家去关注&#xff1a;https://www.bilibili.com/video/BV1Z34y1P7zz/?spm_id_from333.880.my_history.page.click&vd_source4e0b40493e2382633fab2ddc1bb1d9cc 下载网址&#xff1a;https://flightsim.to/file/8163/flight-recorder 坠毁检…

嘿!AI 编码新玩法上线!

随着 AI 智能浪潮到来&#xff0c;AI 编码助手成为越来越多开发者的必备工具&#xff0c;将开发者从繁重的编码工作中解放出来&#xff0c;极大地提高了编程效率&#xff0c;帮助开发者实现更快、更好的代码编写。 通义灵码正是这样一款基于阿里云通义代码大模型打造的智能编码…

如何保证消息的顺序性

先看看顺序会错乱的场景&#xff1a;RabbitMQ&#xff1a;一个 queue&#xff0c;多个 consumer&#xff0c;这不明显乱了&#xff1a; 解决方案&#xff1a;

代码背后的女性:突破性别壁垒的技术先驱

个人主页&#xff1a;17_Kevin-CSDN博客 收录专栏&#xff1a;《程序人生》 引言 在计算机科学的历史长河中&#xff0c;有许多杰出的女性为这个领域的发展做出了重要贡献。她们不仅在技术上取得了卓越成就&#xff0c;还打破了性别壁垒&#xff0c;为后来的女性树立了榜样。今…

22 Dytechlab Cup 2022C. Ela and Crickets(思维、找规律、模拟)

思路就是找规律 可以发现&#xff0c;当拐点在角落时的情况和不在角落的情况是不同 当拐点在角落时&#xff0c;只有目标点的横纵坐标其中的一个和它相同时&#xff0c;这时才可能到达。 否则&#xff0c;我们就简单的例子可以看一下&#xff0c;当一个 2 ∗ 2 2*2 2∗2的矩阵的…

伪分布HBase的安装与部署

1.实训目标 &#xff08;1&#xff09;熟悉掌握使用在Linux下安装伪分布式HBase。 &#xff08;2&#xff09;熟悉掌握使用在HBase伪分布式下使用自带Zookeeper。 2.实训环境 环境 版本 说明 Windows 10系统 64位 操作电脑配置 VMware 15 用于搭建所需虚拟机Linux系统 …

PostgreSQL容器安装

docker中的centos7中安装 选择对应的版本然后在容器中的centos7中执行下面命令 但是启动容器的时候需要注意 开启端口映射开启特权模式启动init进程 docker run -itd --name centos-postgresql -p 5433:5432 --privilegedtrue centos:centos7 /usr/sbin/init 启动然后进入后先…

ARMv8/ARMv9架构下特权程序之间的跳转模型与系统启动探析

文章目录 背景1、前言小结&#xff1a; 2、4个特权等级/4个安全状态之间的跳转模型小结&#xff1a; 3、启动时镜像之间的跳转模型小结&#xff1a; 4、runtime程序之间的跳转模型小结&#xff1a; 推荐 背景 ARMv8和ARMv9架构是ARM公司推出的先进处理器架构&#xff0c;被广泛…

华为ce12800交换机m-lag(V-STP模式)配置举例

配置## 标题思路 采用如下的思路配置M-LAG双归接入IP网络&#xff1a; 1.在Switch上配置上行接口绑定在一个Eth-Trunk中。 2.分别在SwitchA和SwitchB上配置V-STP、DFS Group、peer-link和M-LAG接口。 3.分别在SwitchA和SwitchB上配置LACP M-LAG的系统优先级、系统ID。 4.分别在…

粒子群算法优化RBF神经网络气体浓度预测

目录 完整代码和数据下载链接:粒子群算法优化RBF神经网络气体浓度预测,pso-rbf气体浓度预测(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88937920 RBF的详细原理 RBF的定义 RBF理论 易错及常见问题 RBF应用实例,粒子群算法优化R…

植物病害识别:YOLO水稻病害识别数据集(1000多张,3个类别,yolo标注)

YOLO水稻病害识别数据集&#xff0c;包含水稻白叶枯病、稻瘟病、水稻褐斑病3个常见病害类别&#xff0c;共1000多张图像&#xff0c;yolo标注完整&#xff0c;可直接训练。 适用于CV项目&#xff0c;毕设&#xff0c;科研&#xff0c;实验等 需要此数据集或其他任何数据集请私…

antv L7结合高德地图使用dome1

antv L7结合高德地图使用 一、设置底图二 、添加antv L7 中要使用的dome1. 安装L7 依赖2. 使用的dome 、以下使用的是浮动功能3. 运行后显示 自定义样式修改1. 设置整个中国地图浮动起来 自定义标注点1. 静态标注点2. 动态标注点&#xff08;点位置需要自己改&#xff09;3. 完…

手机群控软件开发必备源代码分享!

随着移动互联网的飞速发展&#xff0c;手机群控技术在市场推广、自动化测试、应用管理等领域的应用越来越广泛&#xff0c;手机群控软件作为一种能够同时控制多台手机设备的工具&#xff0c;其开发过程中&#xff0c;源代码的编写显得尤为重要。 1、设备连接与识别模块 设备连…

springboot学习笔记2

springmvc响应数据 页面跳转控制 开发模式介绍 快速返回逻辑视图 jsp页面创建 配置jsp视图解析器 mvc初始化 handler返回视图 转发和重定向实现 返回json数据&#xff08;重点 静态资源处理 RestFull风格设计和实战 风格介绍 实战

力扣--76. 最小覆盖子串

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 。 注意&#xff1a; 对于 t 中重复字符&#xff0c;我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。如…

水电站泄洪闸预警系统技术改造项目方案

一、工期安排 2024年1月10日至1月30日&#xff0c;共20天&#xff0c;水电站泄洪闸预警系统建设项目主要以计划工作任务为依据开展并控制工期。 二、预警系统建设项目 水电站泄洪闸预警系统技术改造项目实施内容主要是在每个确定后的预警广播站点采用基础开挖预制地笼浇筑混凝…

WebPack自动吐出脚本

window.c c; window.res ""; window.flag false;c function (r) {if (flag) {window.res window.res "${r.toString()}" ":" (e[r] "") ",";}return window.c(r); }代码改进了一下&#xff0c;可以过滤掉重复的方…