【递归、搜索与回溯】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.衣橱整理 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.被围绕的区域…...
Dataease安装,配置Jenkins自动部署
Dataease安装,配置Jenkins自动部署 一.安装Dataease 安装前准备:1.Ubuntu20.04 LTS国内源安装指定版本Docker 2.docker-compose安装 下载离线安装的安装包,下载地址:https://community.fit2cloud.com/#/download/dataease/v1-…...
关于IDEA启动报错 【JAVA_HOME does not point to a valid JM installation】
希望文章能给到你启发和灵感~ 感谢支持和关注~ 阅读指南 一、基础环境说明1.1 硬件环境1.2 软件环境 二、起因 一、基础环境说明 考虑环境因素不同,大家适当的对比自己的软硬件环境情况分析~ 1.1 硬件环境 MacOS Monterey 版本 1…...
设置小蓝熊的CPU亲和性、CPU优先级再设置法环的CPU亲和性
# 适用于Windows系统 # 时间 : 2024-06-28 # 作者 : 三巧(https://blog.csdn.net/qq_39124701) # 文件名 : 设置小蓝熊的CPU亲和性、CPU优先级再设置法环的CPU亲和性.ps1 # 使用方法: 打开记事本,将所有代码复制到记事本中,保存文件时候修改文件后…...
Oracle中的序列(Sequence)是一种数据库对象
Oracle中的序列(Sequence)是一种数据库对象,用于生成数字序列,通常用于为主键列生成唯一、连续的数值。以下是一些使用序列的案例: 1. **为主键生成唯一值**: 在Oracle中,序列最常用的场景是…...
热点观察 | 《姜饼人王国》新作来袭、《Monopoly GO!》荣登5月全球畅销榜榜首
本周出海热点: 1. 中国品牌借欧洲杯打响知名度 2. 米哈游玩家切割二次元 3. 6月27日,Steam游戏《六月衷曲》上线TapTap 4. 《Monopoly GO!》荣登5月全球畅销榜榜首 5. 《地下城与勇士》拿下本周亚洲T1市场畅销榜冠军 6. 《姜饼人王国》新作强势登顶…...
智能网络构建:探索大模型在网络领域的应用
网络领域以其高度复杂性和快速迭代为特点,完成从网络设计、配置、诊断到安全的网络任务需要广泛的专业知识。这些任务的固有复杂性,加上网络技术和协议不断变化的格局,为传统基于机器学习的方法带来了显著的障碍。这些方法在泛化和自动化网络…...
C++编程逻辑讲解step by step:定义一个Person类,它的每个对象表示一个人。
题目 定义一个Person类,它的每个对象表示一个人。数据成员必须包含姓名、出生年份、死亡年份,一个构造函数,一析构函数,读取数据的成员函数,一个print()成员函数显示所有数据。 #include <iostream> using namespace std;…...
DBdoctor产品介绍
基本信息 DBdoctor是一款企业级数据库监控、巡检、性能诊断、SQL审核与优化平台,致力于解决一切数据库性能问题。采用eBPF技术可对数据库做细粒度的扫描,帮助您一分钟内找到数据库性能问题,实现性能诊断百倍提效。针对数据库性能诊断门槛高、…...
一加Ace3 刷机救砖简化说明
注意:工具使用英文目录,支持救砖和降级。PJE110国行版,CPH2609国际版。目前国行版不能完美转换国际版,每次升级都需要刷oplusstanvbk,不建议使用。跨国转换或ROOT一定先解锁Bootloader,可以使用“一加全能工…...
【服务器05】之【登录/注册账号成功转至游戏场景】
Unity登录注册数据库 打开【服务器01】的文章项目 导入新UI系统 点击2D 双击输入栏位置 修改输入框尺寸及位置 放大字体 修改默认输入文字 发现中文字变成了口口口口 原因是新UI系统不支持中文,解决这个问题需要更换字体 并且修改输入时字体大小 我们取电脑中找Fon…...
平价蓝牙耳机推荐性价比高,性价比高的蓝牙耳机学生党推荐
市场上的蓝牙耳机价格从几十元到几百甚至上千不等,性能与价格也呈现多样化,对于学生党来说,一个理想的选择是那些性价比高的平价蓝牙耳机,它们在不牺牲必要功能的同时,提供了可接受的音质和足够的便利性,接…...
【华为战报】5月、6月HCIP考试战报!
华为认证:HCIA-HCIP-HCIE 点击查看: 【华为战报】4月 HCIP考试战报! 【华为战报】2月、3月HCIP考试战报! 【华为战报】11月份HCIP考试战报! 【HCIE喜报】HCIE备考2个月丝滑通关,考试心得分享ÿ…...
OBD诊断
文章目录 OBD 参考标准OBD 服务OBD服务中的DTCOBD服务中0x03和0x07的区别参考 OBD 参考标准 OBD的标准: ISO 15031 Road Vehicles-Communication between vehicle and external equipment for emission-related diagnostics OBD 服务 序号ID服务说明服务详解10x0…...
Elasticsearch 聚合查询
Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…...
adb remount fails - mount: ‘system‘ not in /proc/mounts 解决办法
mount -o rw,remount /挂载根 mount -o ro,remount /将状态重置为“ro” 以下是我个人的一些话 我热衷于在网络上分享我遇到的问题和解决方案。如果你有任何问题或需要帮助,欢迎留言交流,在共同学习的道路上一起进步。我很高兴结识那些在学习上积极进取…...
百元蓝牙耳机推荐2024哪个好?蓝牙耳机性价比之王推荐
现在的百元价位的蓝牙耳机成为了许多消费者入门级的选择,它不仅需要满足基础的通话需求,更要在音质、舒适度、续航能力等多方面达到一定的标准,随着技术的发展和市场的竞争激烈,各大品牌在这一价格区间推出了极具竞争力的产品&…...
Spring项目报错解读与全部报错详解
你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ gitee https://gitee.com/Qiuner 🌹 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^) 想看更多 那就点个关注吧 我…...
10秒教会你mysql的连接
连接MySQL数据库通常可以通过多种方法实现,以下是几种常见的方法,我将按照您的要求以清晰、分点的方式归纳说明: 1. 使用MySQL命令行客户端 打开终端或命令提示符:首先,打开您的计算机上的终端或命令提示符窗口。输入…...
万物皆可爬——亮数据代理IP+Python爬虫批量下载百度图片助力AI训练
💂 个人网站:【 摸鱼游戏】【神级代码资源网站】【导航大全】🤟 一站式轻松构建小程序、Web网站、移动应用:👉注册地址🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交…...
OpenCv形态学(一)
目录 形态学转换 结构元素 腐蚀 膨胀 开运算 闭运算 形态学梯度 顶帽 黑帽 图像轮廓 查找轮廓 绘制轮廓 形态学转换 形态变换是一些基于图像形状的简单操作。通常在二值图像上执行。它需要两个输入,一个是我们的原始图像,第二个是决定操作性…...
CSS基础汇总
CSS 1. 选择器 标签选择器 通过标签名找标签(把指定的样式应用到某一个、组、类标签上) id选择器 通过id属性值找标签,关键符号#id值{样式} 复合选择器 1、并列选择器:关键符号,用法:选择器1,…...
cocos creator让所有button点击时播放音效
原理: 利用prototype属性,通过重写 cc.Button.prototype._onTouchEnded 方法,以便在按钮被点击时播放音频。通过重写其 _onTouchEnded 方法,可以添加自定义行为,如播放音频。 概念解释: prototype&#…...
mybatisplus自带的雪花算法(IdType.ASSIGN_ID)无法自动生成弊端缺点,以及改进方法
前言 今日在使用mybatisplus的雪花算法自动给id赋值时发现怎么都是null的情况,这尼玛测了半天,终于发现巨坑,废话不多说,直接上干货 IService.save 只有调用IService中的save方法才能正常生成id,像IService.saveBatc…...
单位转换:将kb转换为 MB ,GB等形式
写法一: function formatSizeUnits(kb) {let units [KB, MB, GB, TB, PB,EB,ZB,YB];let unitIndex 0;while (kb > 1024 && unitIndex < units.length - 1) {kb / 1024;unitIndex;}return ${kb.toFixed(2)} ${units[unitIndex]}; } console.log(for…...
优思学院|「按计划推动型」与「需求拉动型」的生产模式
针对生产架构做对比分类的用语,主要有按计划推进型与需求拉动型。 「按计划推动型」与「需求拉动型」两者乃是生产架构上常使用、成对比的两个用语。不过,有时不只用来指单纯的生产现场架构,也有人把它应用在更广泛的生产架构设计上。 按计划…...
解释什么是lambda函数?它有什么好处?
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...
码农:如何快速融入团队
问题: 码农如何快速融入团队? 记住一个标准:能干事、能抗事。 总结一个字: 靠谱。 适用范围:新手码农、老司机码农、测试、DBA、运维、产品经理、项目经理、架构师、技术专家、。。。。适用于任何行业的打工者。 下面要…...
Android 通知组
一. 通知组简介 从 Android 7.0(API 级别 24)开始,您可以在一个组中显示相关通知。如下所示: 图 1. 收起(顶部)和展开(底部)的通知组。 注意 :如果应用发出 4 条或更多条通知且未…...
【机器学习】ChatTTS:开源文本转语音(text-to-speech)大模型天花板
目录 一、引言 二、TTS(text-to-speech)模型原理 2.1 VITS 模型架构 2.2 VITS 模型训练 2.3 VITS 模型推理 三、ChatTTS 模型实战 3.1 ChatTTS 简介 3.2 ChatTTS 亮点 3.3 ChatTTS 数据集 3.4 ChatTTS 部署 3.4.1 创建conda环境 3.4.2 拉取源…...
.net网站开发优点/搜索引擎优化seo论文
js 数组去重 记得js 数组去重3种方法: for 循环两次 使用 Array.prototype.indexOf[注意这个方法是 es5 的,兼容性] 使用 对象的键具有唯一性的这一特性,其实在python中的 sets key 也是具有唯一性的 // 使用第三种方法实现的兼容性处理&…...
网站建设的软件/seo博客模板
来看看strdup在Glibc 2.20(标准C库)中的实现: 默认参数s不为空指针,这个在我们的数据结构库中是有问题的 改进: 当前版本g编译器不允许析构函数抛异常这么做 打印出来结果:1 3 然后程序崩溃 我们都删除了…...
新手学做网站的书/热搜词排行榜
花了一晚上和一上午时间终于搞清楚了。树状数组下标不能从0开始,这样会死循环,树状数组可以求逆序数,但是如果要求一个序列中前面的元素小于等于当前元素的个数和怎么求呢?比如:5个数:1 3 1 5 2;…...
可以做网站的电脑软件/360指数查询
网站被挂马一直是被广大站长所痛恶,又感到困扰的一件事,下面我把一些快速查找木马的方法分享给大家。虚拟主机站长上传源码后一段时间后发现网站被挂马,怎样快速查找锁定木马呢?首先我们要知道一般cms工作的时候其文件时不会改变的…...
典型b2c模式的网站/怎样做品牌推广
硬盘分区不是自己想要的?分区容量不够需要扩容?电脑硬盘已经分好区,需要调整分区大小怎么办?下载分区助手专业版易我分区大师专业版软件,帮助管理磁盘分区,调整磁盘布局。 官网详情访问: https://www.ease…...
做soho建立网站/seo课程培训机构
在Vs2005中新建一个Web项目,添加两个Web窗体(Default、Default2),在Default窗体上添加两个标准控件,一个TextBox(TextBox1)、一个Button(Button1),设置Button…...