洪水灌溉算法 + 总结
文章目录
- floodfill算法
- 图像渲染
- 题解
- 代码
- 岛屿数量
- 题解
- 代码
- 岛屿的最大面积
- 题解
- 代码
- 被围绕的区域
- 题解
- 代码
- 太平洋大西洋水流问题
- 题解
- 代码
- 扫雷游戏
- 题解
- 代码
- 衣橱整理
- 题解
- 代码
- 总结
floodfill算法
1. 寻找相同性质的联通块,可以使用dfs或者bfs解决,比如把1连通块的周围都修改为2

图像渲染
题目链接

题解
1.我们通过将以sr,sc为起始点,将该点周围的联通块都修改为color
2. 全局变量: p记录要修改的联通块的值,m,n矩阵的长和宽,坐标dx,dy向上下左右方向搜索
3. 细节处理:如果起始点(sr,sc)就是color的值,不需要修改直接返回矩阵,因为该点周围已经被渲斓为color颜色了,这样会无限渲斓下去,因为是同一个值,未改变,具体可以看实例二

代码
class Solution
{
public:int m,n;int p; // 渲斓一个联通块vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {p = image[sr][sc];m = image.size(),n = image[0].size();// 避免死循环,该点和该点周围一圈都是目标颜色,就无限进入循环中if(image[sr][sc] == color) return image;dfs(image,sr,sc,color);return image;}int dx[4] = {-1,1,0,0};int dy[4] = {0,0,-1,1};void dfs(vector<vector<int>>& image,int i,int j,int color){image[i][j] = color;for(int k = 0;k < 4;k++){// 用例一:不会到达值是0的位置int x = dx[k] + i,y = dy[k] + j;if(x >= 0 && x < m && y >= 0 && y < n && image[x][y] == p){dfs(image,x,y,color);}}}
};
岛屿数量
题目链接

题解
1. 计算联通块的数量,只要左右上下相邻的1就是一个连通块
2. 需要使用标记数组标记已经走过的1,避免重复到达同一个1,或者把搜索过的1都修改为0,建议使用第一种,第二中如果想要恢复成原来的数组比较困难
代码
class Solution
{
public:int m,n;int count;// 记录联通块的个数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'){dfs(grid,i,j);count++;} }} return count; }int dx[4] = {0,0,-1,1};int dy[4] = {-1,1,0,0};void dfs(vector<vector<char>>& grid,int i,int j){for(int k = 0;k < 4;k++){int x = dx[k] + i,y = dy[k] + j;if(x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == '1') {grid[x][y] = '0';dfs(grid,x,y);}} }
};
岛屿的最大面积
题目链接

题解
1. 使用标记数组标记已经使用过的格子,每次count设置为0,在dfs中每遇到一个是false并且值是1的格子就标记一下,并且count++,dfs返回之后更新下count,找下最大值
代码
class Solution
{
public:int m,n;int ret;// 记录最大岛屿面积int count;bool vis[51][51];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(!vis[i][j] && grid[i][j] == 1){vis[i][j] = true;count = 0;dfs(grid,i,j);ret = max(ret,count);}}}return ret;}int dx[4] = {-1,1,0,0};int dy[4] = {0,0,-1,1};void dfs(vector<vector<int>>& grid,int i,int j){vis[i][j] = true;count++;for(int k = 0;k < 4;k++){int x = dx[k] + i,y = dy[k] + j;if(x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && grid[x][y] == 1){// path在参数中回溯会自动恢复现场,path会比实际的值小dfs(grid,x,y);}}}
};
被围绕的区域
题目链接

题解
1. 怎么检查四周是被X围绕的呢?
正难则反,正着的情况下,如果想要修改中间的O,需要一个dfs,如果想要四周的O不变,又需要一个dfs,如果想要将四周的O修改为X,又需要回溯去还原
2. 算法思路:
可以先使用dfs把四周的O修改为点,再在函数中将点的修改为O,O的修改为X,这就是正难则反

代码
class Solution
{
public:int m,n;void solve(vector<vector<char>>& board) {m = board.size(),n = board[0].size();// 1.把与边界'O'相连的连通块,修改为'.'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++){if(board[i][0] == 'O') dfs(board,i,0);if(board[i][n-1] == 'O') dfs(board,i,n-1);}// 2.把所有的'.'还原为'O',把'O'改为'X'for(int i = 0;i < m;i++){for(int j = 0;j < n;j++){if(board[i][j] == '.') board[i][j] = 'O';// 这里不可以写成if,因为可能是上面的'.'修改成的'O'else if(board[i][j] == 'O') board[i][j] = 'X';}}}int dx[4] = {-1,1,0,0};int dy[4] = {0,0,-1,1};void dfs(vector<vector<char>>& board,int i,int j){board[i][j] = '.';for(int k = 0;k < 4;k++){int x = dx[k] + i,y = dy[k] + j;if(x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'O'){dfs(board,x,y);}}}
};
太平洋大西洋水流问题
题目链接

题解
1. 正着来的话,每个格子可能会走多次,会超时,比如2可以向左走到太平洋中,5也可以向左走到太平洋中
2. 正难则反,可以从小的格子向大的格子走,如果比此格子小则停止,这样不会重复走,从太平洋那边走的使用一个标记数组,从大西洋那边走的,使用一个标记数组,如果两个标记数组都为真则这些格子是可以流向两个洋的

代码
class Solution
{
public:int m,n;vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {vector<vector<int>> ret;m = heights.size(),n = heights[0].size();vector<vector<bool>> pac(m,vector<bool>(n));vector<vector<bool>> atl(m,vector<bool>(n));for(int j = 0;j < n;j++){dfs(heights,0,j,pac);dfs(heights,m-1,j,atl); }for(int i = 0;i < m;i++){dfs(heights,i,0,pac);dfs(heights,i,n-1,atl);}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;}int dx[4] = {-1,1,0,0};int dy[4] = {0,0,-1,1};// oce一定要传引用为了修改原始数组中的值void dfs(vector<vector<int>>& heights,int i,int j,vector<vector<bool>>& oce){oce[i][j] = true;for(int k = 0;k < 4;k++){int x = dx[k] + i,y = dy[k] + j;if(x >= 0 && x < m && y >= 0 && y < n && heights[i][j] <= heights[x][y] && !oce[x][y]){dfs(heights,x,y,oce);}}}
};
扫雷游戏
题目链接

题解
1. 模拟 + dfs
2. 有一个非常重要的点是click下的点如果不是地雷的话,那么后面就不会再翻出地雷了
3. 算法思路:检测开始点击的点是否是地雷,如果是就把该点修改为’X’,如果不是就往下搜索,并且在dfs中新建一个变量统计地雷的个数,如果在该点的八个方向上有地雷,就在该点显示地雷的个数,并且返回(不会把地雷打开),如果没有地雷,把该点修改为’B’,并且在该点的八个方向上去dfs(递归式地展开,可能没有地雷就连续地展开)

代码
class Solution
{
public:int m,n;int dx[8] = {-1,1,0,0,1,1,-1,-1};int dy[8] = {0,0,-1,1,1,-1,1,-1};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;}void dfs(vector<vector<char>>& board,int i,int j){// 统计一下地雷的个数int count = 0;// 寻找这一个点的这一圈的地雷个数for(int k = 0;k < 8;k++){int x = dx[k] + i,y = dy[k] + j;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 k = 0;k < 8;k++){int x = dx[k] + i,y = dy[k] + j;if(x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'E'){dfs(board,x,y);}}}}
};
衣橱整理
题目链接

题解
1. 细节处理:表示x的各数位之和,就是x的各个位置上的数字之和,开始的时候没有注意到
2. 这题就是向右或者向下去dfs,找到 两个坐标的数位之和 <= cnt的点,算出这些点的个数
代码
class Solution
{
public:int m,n;int count;bool vis[101][101];int wardrobeFinishing(int _m, int _n, int cnt) {m = _m,n = _n;dfs(0,0,cnt);if(0 <= cnt) count++;return count;}int dx[2] = {1,0};int dy[2] = {0,1};void dfs(int i,int j,int cnt){for(int k = 0;k < 2;k++){int x = dx[k] + i,y = dy[k] + j;int val1 = x,sum1 = 0;int val2 = y,sum2 = 0;while(val1){sum1 += (val1 % 10);val1 /= 10;}while(val2){sum2 += (val2 % 10);val2 /= 10;}if(x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && sum1 + sum2 <= cnt){count++;vis[x][y] = true;dfs(x,y,cnt);}}}
};
总结
1. 学习到了正难则反的思想
2. 寻找性质相同的联通块,通过dfs将其修改或是统计联通块的个数
3. 无非都是通过4个方向或者是八个方向或者是2个方向上去搜索
相关文章:
洪水灌溉算法 + 总结
文章目录 floodfill算法图像渲染题解代码 岛屿数量题解代码 岛屿的最大面积题解代码 被围绕的区域题解代码 太平洋大西洋水流问题题解代码 扫雷游戏题解代码 衣橱整理题解代码 总结 floodfill算法 1. 寻找相同性质的联通块,可以使用dfs或者bfs解决,比如…...
docker中间件部署
1.docker安装 # 1.卸载旧版本 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine# 2.需要的安装包 yum install -y yum-utils# 3.设置镜像的仓库 # 3.1.默认是国外的&#x…...
LangChain4j(1):初识LangChain4j
1 什么是LangChain和LangChain4j LangChain是一个大模型的开发框架,使用LangChain框架,程序员可以更好的利用大模型的能力,大大提高编程效率。如果你是一个lava程序员,那么对LangChain最简单直观的理解就是,LangChain…...
基于 Swoole 的高性能 RPC 解决方案
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
Photoshop 2025安装包下载及Photoshop 2025详细图文安装教程
文章目录 前言一、Photoshop 2025安装包下载二、Photoshop 2025安装教程1.解压安装包2.运行程序3.修改安装路径4.设安装目录5.开始安装6.等安装完成7.关闭安装向导8.启动软件9.安装完成 前言 无论你是专业设计师,还是初涉图像处理的小白,Photoshop 2025…...
CPU跑大模型怎么加速?
一、概念 近几年,大模型的规模越做越大。普通码农没几张显卡几乎都跑不动动辄几百B的模型了。当然,随着SLM进一步发展,移动端、PC端部署SLM变得轻松了起来。即便只有CPU也能带得起3B以内的SLM,只不过推理速度比较感人。因此&#…...
PostgreSQL详解
第一章:环境部署与基础操作 1.1 多平台安装详解 Windows环境 图形化安装 下载EnterpriseDB安装包(含pgAdmin) 关键配置项说明: # postgresql.conf优化项 max_connections 200 shared_buffers 4GB work_mem 32MB 服务管理命…...
SQL Server安装程序无法启动:系统兼容性检查失败
问题现象: 运行 SQL Server 2022 安装程序时,提示 “硬件或软件不满足最低要求”,安装向导直接退出或无法继续。 快速诊断 操作系统版本检查: # 查看 Windows 版本(需 20H2 或更高) winver 支持的系统&…...
期权合约作废的话,权利金和保证金会退还么?
在期权交易中,权利金是否可以退回,主要取决于期权的交易情况和合约条款。 期权作废的三种情形 一般来说期权作废一共有三种情况,分别是到期没有行权、主动放弃或者是标的退市了。 第一种是到期未行权,一般来说值得都是虚值期权&…...
MIPI计算ECC和CRC工具介绍
一、MIPI简介 MIPI联盟,即移动产业处理器接口(Mobile Industry Processor Interface 简称MIPI)联盟。MIPI(移动产业处理器接口)是MIPI联盟发起的为移动应用处理器制定的开放标准和一个规范。MIPI官网https://mipi.org/…...
医院管理系统(源码)分享
「医院管理系统(源码) 源码: https://pan.quark.cn/s/b6e21488fce3 第1章 绪论 1.1 项目背景 随着计算机科学的迅猛发展和互联网技术的不断推进,人们的生活方式发生了巨大的变化,同时也推动了整个软件产业的发展。把…...
使用Geotools从DEM数据中读取指定位置的高程实战
目录 前言 一、GridCoverage2D对象介绍 1、GridCoverage2D的属性 2、GridCoverage2D核心方法 3、GridCoverage2D中的高级操作 二、指定位置的高程获取 1、存储原理 2、相关属性的获取 3、获取高程的方法 三、总结 前言 在地理信息科学领域,高程数据是至关重…...
uniapp 在app上 字体如何不跟着系统字体大小变
在UniApp开发中,默认情况下App的字体可能会跟随系统字体设置而变化。如果你希望保持固定的字体样式,不随系统字体设置改变,可以采用以下几种方法: 方法一:全局CSS设置 在App.vue的样式中添加以下CSS: /*…...
RAG优化:python从零实现GraphRag 一场文档与知识的“恋爱”之旅
嘿,亲爱的算法工程师们,准备好迎接一场文档与知识的“恋爱”之旅了吗?今天我们要介绍的 Graph RAG,就像是一位“红娘”,帮助文档和知识在图的世界里找到彼此,擦出智慧的火花! 文章目录 为什么需要 Graph RAG?Graph RAG 的“恋爱秘籍”准备好了吗?让我们开始吧!环境设…...
STM32F103_LL库+寄存器学习笔记05 - GPIO输入模式,捕获上升沿进入中断回调
导言 GPIO设置输入模式后,一般会用轮询的方式去查看GPIO的电平状态。比如,最常用的案例是用于检测按钮的当前状态(是按下还是没按下)。中断的使用一般用于计算脉冲的频率与计算脉冲的数量。 项目地址:https://github.…...
如何为你的github开源项目选择合适的开源协议?
如何为你的github开源项目选择合适的开源协议? 导言 在github开源世界中,选择一个合适的开源协议是至关重要的。它不仅定义了他人如何使用你的代码,还决定了你的项目能否被广泛接受和传播,还能避免侵权问题。 然而,面…...
【深度破解】爬虫反反爬核心技术实践:验证码识别与指纹伪装
一、反爬技术体系全景图 现代Web应用的常见反爬手段: mermaid: graph TDA[反爬体系] --> B[行为特征检测]A --> C[验证码体系]A --> D[指纹追踪]B --> B1[请求频率]B --> B2[鼠标轨迹]B --> B3[页面停留时间]C --> C1[图形验证码…...
dynamic_cast的理解
dynamic_cast:(具体使用就不详细说明了) C 中用于 安全的类层次结构转换 的类型转换运算符,主要用于 多态类型(即包含虚函数的类)的指针或引用之间的转换 前提条件: 必须要有虚函数才能使用 dy…...
MATLAB 编写的函数或算法生成可供 C++ 调用的库或组件
MATLAB 编写的函数或算法生成可供 C 调用的库或组件 使用 MATLAB Coder 生成 C/C 代码: MATLAB Coder 允许您将 MATLAB 函数转换为可移植的 C 或 C 代码。生成的代码可以作为静态库、动态库或源代码,供 C 项目直接调用。具体步骤包括: 准备…...
Java基础知识-反射
一、什么是反射? Java反射(Reflection)是Java语言的核心特性之一,它允许程序在运行时(Runtime)动态地操作类和对象。通过反射API,我们可以在程序运行期间: 获取任意类的Class对象构…...
【大模型学习】什么是具身智能
目录 一、技术背景与历史发展 二、什么是具身智能? 三、技术要点及具体实现细节 1. 感知技术: 2. 运动控制: 3. 学习机制: 4. 人机交互: 四、架构 五、应用 六、实际应用案例 一、技术背景与历史发展 人工智能的…...
直播预告 | TDgpt 智能体发布 时序数据库 TDengine 3.3.6 发布会即将开启
从海量监控数据,到工业、能源、交通等场景中实时更新的各类传感器数据,时序数据正在以指数级速度增长。而面对如此庞杂的数据,如何快速分析、自动发现问题、精准预测未来,成为企业数字化转型过程中的关键挑战。 TDengine 的答案是…...
服务器硬盘出现故障都有哪些解决方法?
服务器作为核心的硬件设施和互联网中必不可少的网络设备,承载着重要的数据信息和业务应用,但是服务器硬盘也会出现故障的情况,当服务器硬盘发生故障该如何进行解决呢,下面,我们就从以下几个方面进行探讨一下吧…...
vscode 通过Remote-ssh远程连接服务器报错 could not establish connection to ubuntu
vscode 通过Remote-ssh插件远程连接服务器报错 could not establish connection to ubuntu,并且出现下面的错误打印: [21:00:57.307] Log Level: 2 [21:00:57.350] SSH Resolver called for "ssh-remoteubuntu", attempt 1 [21:00:57.359] r…...
【JavaScript 简明入门教程】为了Screeps服务的纯JS入门教程
0 前言 0-1 Screeps: World 众所不周知,Screeps: World是一款面向编程爱好者的开源大型多人在线即时战略(MMORTS)沙盒游戏,其核心机制是通过编写JavaScript代码来控制游戏中的单位(称为“Creep”)&#…...
Prometheus stack命令行接入springboot服务metrics
使用Prometheus Stack监控SpringBoot应用 本文将详细介绍如何使用Prometheus Stack监控SpringBoot应用的metrics。假设你已经安装了Kubernetes集群,并使用Helm安装了Prometheus Stack全家桶。SpringBoot应用已经配置好,暴露了相应的metrics端点。 Sprin…...
Git Bash 设置Notepad++作为默认编辑器
网上搜的时候发现别人搞得有点复杂 (绝对正确的方法)Git Bash 设置Notepad作为默认编辑器_git 通过notpad 编辑器-CSDN博客 最简单的方式就是重新安装git,然后在选择编辑器的时候,勾选notepad即可...
Qt 制作验证码
Qt 制作验证码 #include <QRandomGenerator> #include <QPainterPath> #include <QPainter>// 生成随机数 int r(int a,int b0){return b ? QRandomGenerator::global()->bounded(a, b): QRandomGenerator::global()->bounded(a); }// 生成随机多边形…...
WPF InkCanvas 控件详解
1. InkCanvas 是什么? InkCanvas 是 WPF 提供的一个手写绘图控件,它允许用户使用鼠标、触摸屏或手写笔在界面上进行绘图、标注等操作。 核心特点: ✅ 具备笔迹存储和管理功能。 ✅ 提供 Children 和 Strokes 两个集合,分别用于管理子控件和绘制的笔迹。 ✅ 通过 EditingM…...
【数据结构】二叉树 — 经典OJ面试题剖析!!!
目录 二叉树相关oj题 1. 检查两颗树是否相同 2. 另一棵树的子树 3. 翻转二叉树 4. 判断一颗二叉树是否是平衡二叉树 5. 对称二叉树 6. 二叉树的构建及遍历 7. 二叉树的层序遍历 8. 判断一棵树是不是完全二叉树 9. 二叉树的最近公共祖先 10. 根据前序与中序遍历序列构…...
