floodfill+DFS(2)

news2024/9/20 1:43:20

文章目录

  • 太平洋大西洋流水问题
  • 扫雷游戏
  • 迷路的机器人

太平洋大西洋流水问题

在这里插入图片描述

class Solution {
public:
    vector<vector<int>> res;
    int m = 0, n = 0;
    vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
        m = heights.size();
        n = heights[0].size();
        vector<vector<bool>> check1(m, vector<bool>(n, false));
        vector<vector<bool>> check2(m, vector<bool>(n, false));
        for (int i = 0; i < m; ++i) {
            if (!check1[i][0])
                dfs(heights, check1, i, 0);
            if (!check2[i][n - 1])
                dfs(heights, check2, i, n - 1);
        }
        for (int i = 0; i < n; ++i) {
            if (!check1[0][i])
                dfs(heights, check1, 0, i);
            if (!check2[m - 1][i])
                dfs(heights, check2, m - 1, i);
        }
        for (int i = 0; i < m; ++i)
            for (int j = 0; j < n; ++j) {
                if (check1[i][j] && check2[i][j])
                    res.push_back({i, j});
            }
        return res;
    }
    void dfs(vector<vector<int>>& heights, vector<vector<bool>>& check, int i, int j) {
        check[i][j] = true;
        int dx[4] = {0,0,1,-1};
        int dy[4] = {1,-1,0,0};
        for(int k = 0; k < 4; k++){
            int x = i + dx[k];
            int y = j + dy[k];
            if(x >= 0 && y >= 0 && x < m && y < n && heights[x][y] >= heights[i][j] && !check[x][y])
                dfs(heights, check, x, y);
        }
    }
};

扫雷游戏

代码1 与 代码2 的相似度达到 99%,但其差异性在逻辑思维上存在先后影响。有兴趣的道友可以细细体会一下
代码1:

class Solution {
public:
    int dx[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
    int dy[8] = {-1, 0, 1, -1, 1, -1, 0, 1};
    bool check[51][51] = {false};
    int m = 0, n = 0;
    vector<vector<char>> updateBoard(vector<vector<char>>& board,
                                     vector<int>& click) {
        // 预处理,将已经处理过的点标记
        m = board.size();
        n = board[0].size();
        for (int i = 0; i < m; ++i)
            for (int j = 0; j < n; ++j) {
                if (board[i][j] != 'M' && board[i][j] != 'E')
                    check[i][j] = true;
            }
        // 解题默认点击未挖出的点:未挖出的点分为两种情况:M & E
        if (board[click[0]][click[1]] == 'M') {
            board[click[0]][click[1]] = 'X';
        } else if (board[click[0]][click[1]] == 'E') {
            dfs(board, click[0], click[1]);
        }

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

        if (count != 0)
            board[i][j] = '0' + count;
        else {
            for (int k = 0; k < 8; ++k) {
                int x = i + dx[k];
                int y = j + dy[k];
                if (x >= 0 && y >= 0 && x < m && y < n && !check[x][y] && board[x][y] == 'E')
                    dfs(board, x, y);
            }
        }
        // 处理过的点进行标记
        check[i][j] = true;
    }
};

代码2:

class Solution {
public:
    int dx[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
    int dy[8] = {-1, 0, 1, -1, 1, -1, 0, 1};
    bool check[51][51] = {false};
    int m = 0, n = 0;
    vector<vector<char>> updateBoard(vector<vector<char>>& board,
                                     vector<int>& click) {
        // 预处理,将已经处理过的点标记
        m = board.size();
        n = board[0].size();
        for (int i = 0; i < m; ++i)
            for (int j = 0; j < n; ++j) {
                if (board[i][j] != 'M' && board[i][j] != 'E')
                    check[i][j] = true;
            }
        // 解题默认点击未挖出的点:未挖出的点分为两种情况:M & E
        if (board[click[0]][click[1]] == 'M') {
            board[click[0]][click[1]] = 'X';
        } else if (board[click[0]][click[1]] == 'E') {
            dfs(board, click[0], click[1]);
        }

        return board;
    }
    void dfs(vector<vector<char>>& board, int i, int j) {
        board[i][j] = 'B';
        int count = 0;
        for (int k = 0; k < 8; ++k) {
            int x = i + dx[k];
            int y = j + dy[k];
            if (x >= 0 && y >= 0 && x < m && y < n && board[x][y] == 'M')
                count++;
        }
        // 处理过的点进行标记
        check[i][j] = true;
        
        if (count != 0)
            board[i][j] = '0' + count;
        else {
            for (int k = 0; k < 8; ++k) {
                int x = i + dx[k];
                int y = j + dy[k];
                if (x >= 0 && y >= 0 && x < m && y < n && !check[x][y])
                    dfs(board, x, y);
            }
        }
    }
};

迷路的机器人

class Solution {
public:
    vector<vector<int>> res;
    int m = 0, n = 0;
    bool check[101][101] = {false};
    vector<vector<int>> pathWithObstacles(vector<vector<int>>& obst) {
        m = obst.size();
        n = obst[0].size();
        if (obst[0][0] == 1 || obst[m - 1][n - 1] == 1)
            return {};
        res.push_back({0, 0});
        for (int i = 0; i < m; ++i)
            for (int j = 0; j < n; ++j) {
                if (obst[i][j] == 1)
                    check[i][j] = true;
            }
        if (!dfs(obst, 0, 0))
            res.pop_back();
        return res;
    }
    bool dfs(vector<vector<int>>& obst, int i, int j) {
        if (res.size() == m + n - 1) {
            return true;
        }
        int dx[2] = {0, 1};
        int dy[2] = {1, 0};
        for (int k = 0; k < 2; k++) {
            int x = i + dx[k];
            int y = j + dy[k];
            if (x < m && y < n && !check[x][y]) {
                if (obst[x][y] == 0) {
                    res.push_back({x, y});
                    if (dfs(obst, x, y))
                        return true;
                    else {
                        res.pop_back();
                        check[x][y] = true;
                    }
                }
            }
        }
        return false;
    }
};

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

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

相关文章

35.贪心算法2

1.按身高排序&#xff08;easy&#xff09; 2418. 按身高排序 - 力扣&#xff08;LeetCode&#xff09; 题目解析 算法原理 代码 class Solution {public String[] sortPeople(String[] names, int[] heights) {// 1. 创建⼀个下标数组int n names.length;Integer[] index …

tair性能挑战赛攻略心得-Zzzzz

关联比赛: 第二届数据库大赛—Tair性能挑战 赛题分析 赛题要求实现一个基于persistent memory&#xff08;AEP&#xff09;的持久化键值存储系统&#xff0c;并要求从数据正确性和系统读写性能两个方面来考虑系统设计。 正确性 数据正确性包括数据写入的持久性和原子性两个…

计算机三级网络技术总结(五)

HTTP端口号为80 三平台一出口&#xff1a;网络平台、业务平台、管理平台和城市宽带出口IEEE802.16最高传输速率为134Mbps链路状态数据库中保存的是全网的拓扑结构图&#xff0c;而非全网完整的路由表在无线局域网中&#xff0c;客户端设备用来访问接入点&#xff08;AP&#xf…

MySQL 中的索引覆盖扫描:加速查询的秘密武器

在 MySQL 数据库的使用中&#xff0c;索引是提高查询性能的重要工具。而索引覆盖扫描&#xff08;Index Covering Scan&#xff09;更是一种能显著提升查询效率的技术。本篇文章我们就来深入了解一下 MySQL 中的索引覆盖扫描是什么。 一、什么是索引覆盖扫描 在 MySQL 中&…

将有序数组——>二叉搜索树

给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵平衡二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#xff1a;[0,-10,5,null,-3,null,9] 也将被视为正确答案…

Python编码系列—Python桥接模式:连接抽象与实现的桥梁

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

【C语言二级考试】循环结构设计

C语言二级考试——循环结构程序设计 五.循环结构程序设计 1.for循环结构 2.while和do-while循环结构 3.continue语句和break语句 4.循环的嵌套 知识点参考【C语言】循环-CSDN博客 文章目录 1.for循环2.while和do-while循环结构3.continue语句和break语句4.循环的嵌套 1.for循环…

ORA-28032 Your password has expired and the database is set to read only

做个记录。 non-cdb 处于只读状态&#xff0c;CDB创建到noncdb的dblink后产生的报错&#xff0c;dblink可以成功创建&#xff0c;但无法连接到non-cdb。 解决&#xff1a;一开始以为是cdb的密码不正确&#xff0c;mos上找到问题&#xff0c;non-cdb的密码过期了&#xff0c;并且…

m4a怎么转换mp3格式?给你推荐八种m4a转MP3的转换方法

m4a怎么转换mp3格式&#xff1f;在数字音乐的世界中&#xff0c;音频格式的多样性常常让人感到困惑。m4a作为一种流行的音频格式&#xff0c;以其优良的音质和较小的文件体积受到许多用户的青睐&#xff0c;尤其是在苹果设备上。然而&#xff0c;尽管m4a文件在现代设备中表现良…

软件设计画图,流程图、甘特图、时间轴图、系统架构图、网络拓扑图、E-R图、思维导图

目录 一、流程图 二、甘特图 三、时间轴图 四、系统架构图 五、网络拓扑图 六、E-R图 七、思维导图 一、流程图 是一种用符号表示算法、工作流或流程的图形。用不同的图形表示不同含义&#xff0c;如椭圆表示开始和结束、菱形表示判断等。 画图工具WPS office 应用市场…

ShouldSniffAttr在自动化测试中具体是如何应用?

在自动化测试中&#xff0c;ShouldSniffAttr 这样的函数名通常暗示它是一个用于断言&#xff08;assertions&#xff09;的工具&#xff0c;用于检查某个元素或属性是否符合预期的条件。 虽然这不是一个标准的函数名&#xff0c;但我们可以根据命名推测其用途。 例如&#xf…

python 绘制 y=x^3 图像

python 绘制 yx^3 图像 import numpy as np -----------------激活numpy import matplotlib.pyplot as plt -------------------激活matplotlib xnp.arange(-10,10,0.01) ---------------------设置x的取值范围&#xff0c;设置坐标值 yx*x*x ------…

前端常用的主流框架有哪些

前端开发中&#xff0c;有几个主流框架非常受欢迎&#xff0c;它们为开发者提供了丰富的功能和高效的开发体验。以下是一些当前最常用的前端主流框架&#xff1a; React&#xff1a; React 是由 Facebook 开发的一个用于构建用户界面的 JavaScript 库。它鼓励使用组件化的开发模…

Elasticsearch集群的运维与管理

【1】安装启动ES 集群 &#xff08;1.1&#xff09;集群架构规划 OS  ES versionIpnode.nameRolecluster.namees basedirCentOS Linux release 7.8.2003 (Core)elasticsearch-7.14.1 192.168.175.132:9200 cluster&#xff1a;192.168.175.132:9301 node_1 node.mastertrue …

5.C_数据结构_树

概述 树的逻辑结构&#xff1a; 树中任何节点都可以有0个或多个直接后继节点&#xff0c;但最多只有一个直接前驱节点。根节点没有直接前驱节点&#xff0c;叶节点没有直接后继节点。 相关名词&#xff1a; 空树&#xff1a;树中没有节点节点的度数&#xff1a;一个节点的…

【2025】基于微信小程序的人工智能课程学习平台的设计与实现(源码+文档+解答)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

优化算法(四)—蚁群算法(附MATLAB程序)

蚁群算法&#xff08;Ant Colony Optimization, ACO&#xff09;是一种模拟蚂蚁觅食行为的优化算法&#xff0c;由Marco Dorigo于1990年提出。它利用了蚂蚁在寻找食物的过程中通过释放信息素来相互影响的机制&#xff0c;以找到最优解或接近最优解。蚁群算法特别适用于解决组合…

workbench的使用

connection name 是可以任意取的 Hostname 是数据库的地址&#xff0c;本地的话就默认是127.0.0.1 port是端口 选择store in value来存储密码 点击测试连接test connection 单击就可以登录&#xff0c;如果需要编辑的话&#xff0c;右键选择edit connection 可以选择删除账…

MD5、SHA256哈希值生成验证工具-生成文件的“指纹ID”-调用了微软.Net Framework里的加密工具来生成哈希值

MD5、SHA256等哈希值生成工具通常用来验证文件的完整性&#xff0c;或者说是生成文件的“指纹ID”。 Windows系统下调用哈希工具&#xff0c;要用命令提示符cmd调用&#xff0c;生成和比较不太方便。我编写了一个小工具&#xff0c;将文件拖拽到软件界面即可生成比较。 下载地址…

Vue.js与Flask/Django后端配合详细讲解

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…