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

【递归、搜索与回溯】floodfill算法二

floodfill算法二

  • 1.被围绕的区域
  • 2.太平洋大西洋水流问题
  • 3.扫雷游戏
  • 4.衣橱整理

在这里插入图片描述

点赞👍👍收藏🌟🌟关注💖💖
你的支持是对我最大的鼓励,我们一起努力吧!😃😃

1.被围绕的区域

题目链接:130. 被围绕的区域

题目分析:

在这里插入图片描述

把被X上下左右围绕的O区域变成X,注意这个O不能处于边界,因为处于边界的O并不会被X上下左右围绕。

算法原理:

对于这个例子我们仅需把画绿线的区域修改成X就行了。

解法一:直接去做(有困难)

我们刚开始拿到这道题,直接解决这个问题,还是以前一样一行一行扫描遇到O了,就深度优先遍历一次把与它相连的连通块全部都给成X。但是你碰到紫色的O,你深度优先遍历把这些区域都改成X,但是这些区域是不能修改的!

此时可以这样搞,碰到绿色区域深度优先遍历可以改,当碰到紫色区域的O也就说这个连通块处于边界的情况,递归碰到边界是不仅不能改还需要考虑回溯把改的地方给还原回来。但是你会发现代码非常难些。因为这两个区域的深搜是不一样的,要写两种dfs。更致命的问题是我们是在搜索的过程中才发现一个位置是非法的。所以说并不知道这两个区域到底用那个dfs!

所以这样搞挺困难的!

在这里插入图片描述
解法二:正难则反
如果直接去搞比较难,我可以反着来!
这个问题与边界相连的O区域比较难搞,此时就能先把处于边界区域的O先处理一下。那剩下的O就自然在内部了。

那边界怎么处理呢?我们只要扫描边界就可以了,当碰到O就从这个位置来一次dfs,可以把与这个位置相连的O位置标记一下。标记有两种策略,一:搞一个vis数组。二:修改原始值 把边界这些 O 修改成 . 。然后把边界情况处理完之后,在扫描整个矩阵当碰到 . 就把它还原成一个 O,当碰到 O 修改成 X。这样就完美的解决这个问题了。

class Solution {int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};int m,n;
public:void solve(vector<vector<char>>& board) {m=board.size(),n=board[0].size();// 1.把边界的 O 相连的连通块,全部修改成 .for(int i = 0; i < m; ++i)for (int j = 0; j < n; ++j)if(board[i][j] == 'O')if(i == 0 || i == m-1 || j == 0 || j == n-1) dfs(board,i,j);// 2.还原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 i,int j){board[i][j]='.';for(int k = 0; k < 4; ++k){int x = i + dx[k], y = j + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'O'){dfs(board, x, y);}}}
};

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

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

题目分析:

在这里插入图片描述
题目描述很难懂,这里我们简单说一下。有一个mxn的矩阵,这个矩阵相当于一个岛屿。这个岛屿被两个洋包围,其中上和左被太平洋包围。下和右被大西洋包围。这个岛屿被分成一块一块的。其中数字代表这一块的高度。此时如果有水的话,水是可以从较高的地方流向较低的地方,还可以流向和在我周围并且和我相等高度的地方。注意只能上下左右流动。然后题目要求在所有的小格子里能否存在一个位置,这个位置的水既可以流向太平洋又可以流向大西洋。如果可以就把这个位置坐标存下来,最后返回。最终找到的就是这个岛屿中所有即可流向太平洋又可以流向大西洋的小格子。

在这里插入图片描述

算法原理:

把题目搞懂了,你可能里面会想到把所有小格子枚举一遍。遇到一个点就去看这个位置能不能去大西洋和太平洋。如果可以就加入到最终结果。然后在去下一个位置。

解法一:直接判断某一个位置能否去大西洋和太平洋
但是这种直接判断的方式会存在非常多的重复路径,一旦矩阵规模很大这样搞可能会超时。因此我们不能直接解决这个问题。拿到一个点就暴力去判断能不能去大西洋和太平洋。我们要换一种方法来解决这个问题。
在这里插入图片描述

解法二:正难则反

我们要找的是某个位置能不能流向太平洋和大西洋,那我能不能反过来过看大西洋和太平洋能否流到相同的位置!比如说先看太平洋 上左两条边界开始 水能流向那些位置。如果我反向能从太平洋流向某个位置,那这个位置正向也一定能从这个位置流向太平洋。正向是从某个位置流向小于或者等于我的位置。那反向就是流向大于或者等于我的位置。

比如从1开始,一次就可以找到有这么多位置可以从1流向太平洋。然后在上面这一行下一个位置,但是因为1已经把这些位置标记了,所以不会在进去了。这一行都直接结束了。 然后考虑左边这一列,没有被标记的地方我可以去。被标记的地方我都不用去了。因为遍历过的地方只会遍历一次,所以时间复杂度会降的非常多。

我们反着从最上面一行最左边一列找的这些点都可以流向太平洋。

在这里插入图片描述

同理从最下面一行和最右边一列找大西洋能流向那些位置。然后你就会发现有一些重复标记的位置。而这些重复标记的位置就是既能流向太平洋又能流向大西洋。

在这里插入图片描述

class Solution {int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};int m,n;
public: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));// 1. Pacific Ocean for(int j = 0; j < n; ++j)dfs(heights,0,j,pac);for(int i = 0; i < m; ++i)dfs(heights,i,0,pac);// 2. Atlantic Oceanfor(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;// 3. 找重叠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 = i + dx[k], y = j + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && h[x][y] >= h[i][j]){dfs(h, x, y,vis);}}}};

3.扫雷游戏

题目链接:529. 扫雷游戏

题目分析:

在这里插入图片描述

这题说的很多,其实就是给一个mxn的棋盘,再给一个棋盘坐标,点击这个坐标,把修改后的棋盘返回。

我们要注意一下规则:

  • ‘M’ 代表一个 未挖出的 地雷,

在这里插入图片描述

  • ‘E’ 代表一个 未挖出的 空方块,
    在这里插入图片描述

  • ‘B’ 代表没有相邻(上,下,左,右,和所有4个对角线)地雷的 已挖出的 空白方块,

前面我们都只研究上下左右,这里还要考虑斜对角线4个位置。也就是说如果当前被挖的空格周围没有地理,就把它标记成B。
在这里插入图片描述

  • 数字(‘1’ 到 ‘8’)表示有多少地雷与这块 已挖出的 方块相邻,

数字表示这个被挖的格子周围有多少个地雷
在这里插入图片描述

  • ‘X’ 则表示一个 已挖出的 地雷。

根据以下规则,返回相应位置被点击后对应的盘面:

  • 如果一个地雷(‘M’)被挖出,游戏就结束了- 把它改为 ‘X’ 。

也就是说如果刚开始给你的这个位置就是雷的话,把这个位置改成‘X’,直接结束即可!

  • 如果一个 没有相邻地雷 的空方块(‘E’)被挖出,修改它为(‘B’),并且所有和其相邻的 未挖出 方块都应该被递归地揭露。

如果当前被挖的位置周围没有地雷,把它改成’B‘,然后递归的往周围走。

  • 如果一个 至少与一个地雷相邻 的空方块(‘E’)被挖出,修改它为数字(‘1’ 到 ‘8’ ),表示相邻地雷的数量。

如果当前被挖的位置周围有地雷,把它修改成周围的地雷数,然后就不要递归下去了。直接返回。

  • 如果在此次点击中,若无更多方块可被揭露,则返回盘面。

算法原理:

其实这就是一个模拟,已经告诉怎么去操作了。

当点击这个位置之后,我们要先统计一下点击的这个位置周围有没有地雷。周围没有地雷,就把这个位置改成’B‘,然后递归的把周围所有位置都找一遍。如果周围有地雷的话,就把这个位置改成地雷数,然后就不要从这个位置在递归下去了,返回即可。同理递归进去也是如上面一样先统计周围有没有地雷。。。。

不过这里有个细节问题,我们之前是沿着一个位置上下左右找4个位置。但是这个位置要找一圈8个位置。我们还是和之前一样,我们直接把向量数组扩展一下就可以了。可以写两个-1,1之后然后给它们分别匹配-1,1。

在这里插入图片描述

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:vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) {int i=click[0],j=click[1];if(board[i][j] == 'M') //直接点到地雷{board[i][j]='X';return board;}m=board.size(),n=board[0].size();dfs(board,i,j);return board;}void dfs(vector<vector<char>>& board, int i, int j){int cnt=0;for(int k = 0; k < 8; ++k){int x = i + dx[k], y = j + dy[k];if(x >= 0 && x < m && y >= 0 && y < n){if(board[x][y] == 'M') ++cnt;}}if(cnt) //周围有地雷{board[i][j]='0'+cnt;return;}else //周围没地理{board[i][j]='B';for(int k = 0; k < 8; ++k){int x = i + dx[k], y = j + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'E'){dfs(board, x, y);}}}}
};

4.衣橱整理

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

题目分析:

在这里插入图片描述

有一个mxn的格子,从下标0,0出发,注意可以整理的格子横坐标和纵坐标位数和要小于等于cnt。(当 cnt 为 19时,能够进入方格 [35, 37] ,因为 3+5+3+7=18。但它不能进入方格 [35, 38],因为 3+5+3+8=19)统计一下总共可以整理多少个格子。

算法原理:
从开始位置来一次深度优先遍历,把能进入格子的个数统计一下就行。其实就是一步floodfill算法也就是一次深度优先遍历,把相同性质的格子个数找出来,数位之和小于等于cnt。

class Solution {bool vis[101][101];int dx[2]={0,1};int dy[2]={1,0};int m,n,cnt;int count=0;
public:int wardrobeFinishing(int _m, int _n, int _cnt) {m=_m,n=_n,cnt=_cnt;dfs(0,0);return count;}void dfs(int i, int j){++count;vis[i][j]=true;for(int k = 0; k < 2; ++k){int x = i + dx[k], y = j + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && check(x, y)){dfs(x,y);}}}bool check(int i, int j){int sum=0;while(i){sum += i % 10;i /= 10;}while(j){sum += j %10;j /= 10;}return sum <= cnt;}
};

相关文章:

【递归、搜索与回溯】floodfill算法二

floodfill算法二 1.被围绕的区域2.太平洋大西洋水流问题3.扫雷游戏4.衣橱整理 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.被围绕的区域…...

Dataease安装,配置Jenkins自动部署

Dataease安装&#xff0c;配置Jenkins自动部署 一.安装Dataease 安装前准备&#xff1a;1.Ubuntu20.04 LTS国内源安装指定版本Docker 2.docker-compose安装 下载离线安装的安装包&#xff0c;下载地址&#xff1a;https://community.fit2cloud.com/#/download/dataease/v1-…...

关于IDEA启动报错 【JAVA_HOME does not point to a valid JM installation】

希望文章能给到你启发和灵感&#xff5e; 感谢支持和关注&#xff5e; 阅读指南 一、基础环境说明1.1 硬件环境1.2 软件环境 二、起因 一、基础环境说明 考虑环境因素不同&#xff0c;大家适当的对比自己的软硬件环境情况分析&#xff5e; 1.1 硬件环境 MacOS Monterey 版本 1…...

设置小蓝熊的CPU亲和性、CPU优先级再设置法环的CPU亲和性

# 适用于Windows系统 # 时间 : 2024-06-28 # 作者 : 三巧(https://blog.csdn.net/qq_39124701) # 文件名 : 设置小蓝熊的CPU亲和性、CPU优先级再设置法环的CPU亲和性.ps1 # 使用方法: 打开记事本&#xff0c;将所有代码复制到记事本中&#xff0c;保存文件时候修改文件后…...

Oracle中的序列(Sequence)是一种数据库对象

Oracle中的序列&#xff08;Sequence&#xff09;是一种数据库对象&#xff0c;用于生成数字序列&#xff0c;通常用于为主键列生成唯一、连续的数值。以下是一些使用序列的案例&#xff1a; 1. **为主键生成唯一值**&#xff1a; 在Oracle中&#xff0c;序列最常用的场景是…...

热点观察 | 《姜饼人王国》新作来袭、《Monopoly GO!》荣登5月全球畅销榜榜首

本周出海热点&#xff1a; 1. 中国品牌借欧洲杯打响知名度 2. 米哈游玩家切割二次元 3. 6月27日&#xff0c;Steam游戏《六月衷曲》上线TapTap 4. 《Monopoly GO!》荣登5月全球畅销榜榜首 5. 《地下城与勇士》拿下本周亚洲T1市场畅销榜冠军 6. 《姜饼人王国》新作强势登顶…...

智能网络构建:探索大模型在网络领域的应用

网络领域以其高度复杂性和快速迭代为特点&#xff0c;完成从网络设计、配置、诊断到安全的网络任务需要广泛的专业知识。这些任务的固有复杂性&#xff0c;加上网络技术和协议不断变化的格局&#xff0c;为传统基于机器学习的方法带来了显著的障碍。这些方法在泛化和自动化网络…...

C++编程逻辑讲解step by step:定义一个Person类,它的每个对象表示一个人。

题目 定义一个Person类,它的每个对象表示一个人。数据成员必须包含姓名、出生年份、死亡年份&#xff0c;一个构造函数&#xff0c;一析构函数&#xff0c;读取数据的成员函数&#xff0c;一个print()成员函数显示所有数据。 #include <iostream> using namespace std;…...

DBdoctor产品介绍

基本信息 DBdoctor是一款企业级数据库监控、巡检、性能诊断、SQL审核与优化平台&#xff0c;致力于解决一切数据库性能问题。采用eBPF技术可对数据库做细粒度的扫描&#xff0c;帮助您一分钟内找到数据库性能问题&#xff0c;实现性能诊断百倍提效。针对数据库性能诊断门槛高、…...

一加Ace3 刷机救砖简化说明

注意&#xff1a;工具使用英文目录&#xff0c;支持救砖和降级。PJE110国行版&#xff0c;CPH2609国际版。目前国行版不能完美转换国际版&#xff0c;每次升级都需要刷oplusstanvbk&#xff0c;不建议使用。跨国转换或ROOT一定先解锁Bootloader&#xff0c;可以使用“一加全能工…...

【服务器05】之【登录/注册账号成功转至游戏场景】

Unity登录注册数据库 打开【服务器01】的文章项目 导入新UI系统 点击2D 双击输入栏位置 修改输入框尺寸及位置 放大字体 修改默认输入文字 发现中文字变成了口口口口 原因是新UI系统不支持中文&#xff0c;解决这个问题需要更换字体 并且修改输入时字体大小 我们取电脑中找Fon…...

平价蓝牙耳机推荐性价比高,性价比高的蓝牙耳机学生党推荐

市场上的蓝牙耳机价格从几十元到几百甚至上千不等&#xff0c;性能与价格也呈现多样化&#xff0c;对于学生党来说&#xff0c;一个理想的选择是那些性价比高的平价蓝牙耳机&#xff0c;它们在不牺牲必要功能的同时&#xff0c;提供了可接受的音质和足够的便利性&#xff0c;接…...

【华为战报】5月、6月HCIP考试战报!

华为认证&#xff1a;HCIA-HCIP-HCIE 点击查看&#xff1a; 【华为战报】4月 HCIP考试战报&#xff01; 【华为战报】2月、3月HCIP考试战报&#xff01; 【华为战报】11月份HCIP考试战报&#xff01; 【HCIE喜报】HCIE备考2个月丝滑通关&#xff0c;考试心得分享&#xff…...

OBD诊断

文章目录 OBD 参考标准OBD 服务OBD服务中的DTCOBD服务中0x03和0x07的区别参考 OBD 参考标准 OBD的标准&#xff1a; ISO 15031 Road Vehicles-Communication between vehicle and external equipment for emission-related diagnostics OBD 服务 序号ID服务说明服务详解10x0…...

Elasticsearch 聚合查询

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…...

adb remount fails - mount: ‘system‘ not in /proc/mounts 解决办法

mount -o rw,remount /挂载根 mount -o ro,remount /将状态重置为“ro” 以下是我个人的一些话 我热衷于在网络上分享我遇到的问题和解决方案。如果你有任何问题或需要帮助&#xff0c;欢迎留言交流&#xff0c;在共同学习的道路上一起进步。我很高兴结识那些在学习上积极进取…...

百元蓝牙耳机推荐2024哪个好?蓝牙耳机性价比之王推荐

现在的百元价位的蓝牙耳机成为了许多消费者入门级的选择&#xff0c;它不仅需要满足基础的通话需求&#xff0c;更要在音质、舒适度、续航能力等多方面达到一定的标准&#xff0c;随着技术的发展和市场的竞争激烈&#xff0c;各大品牌在这一价格区间推出了极具竞争力的产品&…...

Spring项目报错解读与全部报错详解

你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ ​ gitee https://gitee.com/Qiuner &#x1f339; 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 &#x1f604; (^ ~ ^) 想看更多 那就点个关注吧 我…...

10秒教会你mysql的连接

连接MySQL数据库通常可以通过多种方法实现&#xff0c;以下是几种常见的方法&#xff0c;我将按照您的要求以清晰、分点的方式归纳说明&#xff1a; 1. 使用MySQL命令行客户端 打开终端或命令提示符&#xff1a;首先&#xff0c;打开您的计算机上的终端或命令提示符窗口。输入…...

万物皆可爬——亮数据代理IP+Python爬虫批量下载百度图片助力AI训练

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【导航大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...