算法——BFS解决FloodFill算法
什么是FloodFill算法
中文:洪水灌溉。假设这一块4*4的方格是一块土地,有凸起的地方,也有凹陷的地方(凹陷的地方用负数表示)。此时下大雨发洪水,会把凹陷的地方填满。绿色圈起来的属于一块区域(上下左右四个方向,有时候题目也会问八个方向包括斜着相连的),题目会问有多少块区域被填满,或者问被填满的最大区域是哪个;或某一块区域的边长是多少。但是本质都是让我们在一块区域找性质相同的连通块。
DFS——深度优先遍历(递归):从某一点开始一条路走到黑。以最右列的为例,从-1出发,向下->-2->-10->-12,此时发现-12的上下左右都走不了,在拐回去到-10,然后发现-10左边可以走->-4->-3。
BFS——宽度优先遍历:一层一层拨开。还是以最右边为例,从-1开始拓展一层(上下左右)发现能把-2扩展出来,接着继续扩展一层上下左右,-3和-10扩展出来;接着在扩展一层上下左右,把-4和-12扩展出来。
图像渲染
图像渲染
题目解析
给一个起始位置,让我们把与起始位置相连(上下左右四个方向)且数字相同的区域全都修改为newcolor
算法原理
BFS:刚开始给定一个位置,一层一层扫描(上下左右方向扩展),值相同就添加进来
- 第一层扩进来:
-
接着以新扩进来的为起点,开始上下左右扩展(蓝色为第二、三层扩展)
-
黄色为第四层扩展
然后在扩展的过程中,一边扩展一边把值修改为2.为了方便访问上下左右四个方向的数组,可以定义一个dx、dy(x、y的变化量)。原坐标分别去相加就能遍历到四个方向的坐标位置
代码实现
class Solution
{typedef pair<int, int> PII;int dx[4] = {0, 0, 1, -1}; //定义一个变化量dx、dy,(x,y)分别去加就能遍历到上下左右四个方向int dy[4] = {1, -1, 0, 0};
public:vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {int prev = image[sr][sc]; //先标记一下需要处理的值if(prev == color) return image; //处理边界情况int m = image.size(), n = image[0].size();queue<PII> q;q.push({sr, sc});while(!q.empty()){auto [a, b] = q.front();image[a][b] = color;q.pop();for(int i = 0; i < 4; i++){int x = a + dx[i], y = b + dy[i];if(x >= 0 && x < m && y >= 0 && y < n && image[x][y] == prev){q.push({x, y});}}}return image;}
};
岛屿数量
岛屿数量
题目解析
- 给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
- 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
算法原理
解法:BFS:
从左往右扫描,当第一次遇到1(陆地)时,就把这块陆地连接的岛屿找到,使用BFS宽搜一遍,找到一个岛屿ret++
这里有一个细节问题,如果第一个1宽搜完之后,到下一个1(蓝色的)如果再上下左右宽搜的话,就会重复统计了,为此我们有两种办法:
1.直接修改原数组为0,但这个方法一般会直接修改接口(我们再笔试刷题时一般都是接口类型的函数)
2.创建一个与原数组同等规模的数组vis[m][n],用来标记已经被BFS过的区域,如果宽搜过记为true,没被宽搜过记为false。此时对下个1进行上下左右宽搜时,如果该区域已经被标记为true就不管即可。每次标记为true时,再让ret++
代码实现
class Solution
{int dx[4] = {1, -1, 0, 0};int dy[4] = {0, 0, 1, -1};bool vis[301][301];int m, n;
public:int numIslands(vector<vector<char>>& 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(grid[i][j] == '1' && !vis[i][j]){ret++;bfs(grid, i, j); // 把这块陆地全部标记⼀下}}}return ret;}void bfs(vector<vector<char>>& grid, int i, int j){queue<pair<int, int>> q;q.push({i, j});vis[i][j] = true;while(q.size()){auto [a, b] = q.front();q.pop();for(int k = 0; k < 4; k++){int x = a + dx[k], y = b + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == '1' && !vis[x][y]){q.push({x, y});vis[x][y] = true;}}}}};
岛屿的最大面积
岛屿的最大面积
题目解析
算法原理
要找到所有连通块中的最大面积,就要先找能统计出一个连通块的面积。先从左到右从上往下扫描矩阵,当遇到一个没有遍历过的1的时候,相当于此时找到一个陆地。我们依旧定义一个bool类型的vis数组,用来标记当前位置是否遍历过。然后我们在BFS过程中不仅要标记,还要搞一个count计算面积。当层序遍历结束后,我们就把count返回给主函数。
代码实现
class Solution
{int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};bool vis[51][51];int m, n;
public: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(grid[i][j] == 1 && !vis[i][j]){ret = max(ret, bfs(grid, i, j));}}}return ret;}int bfs(vector<vector<int>>& grid, int i, int j){int count = 0;queue<pair<int, int>> q;q.push({i, j});vis[i][j] = true;count++;while(q.size()){auto [a, b] = q.front();q.pop();for(int k = 0; k < 4; k++){int x = a + dx[k], y = b + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1 && !vis[x][y]){ q.push({x, y});vis[x][y] = true;count++;}}}return count;}
};
被围绕的区域
被围绕的区域
题目解析
找到被X包围的O
算法原理
扫描区域,当扫描到一个O时,就把与O相连的O一起修改为X。当扫描的边界的O时,要多加一个判断,因为他的下方没有X,此时不属于被包围,故不能修改。
解法一:直接做:先BFS一遍,判断区域是否合法,然后再来一遍开始修改
我们之前的FloodFill算法是一边修改,一边遍历,当到刚刚所说的边界情况时,想再修改回X发现此时周围已经全部变成X了,就无法判断了。
也可能有同学会想到,先遍历一遍,如果发现是好的区域(非边界情况)修改,当是边界情况就不修改,此时需要遍历两次
解法二:正难则反
本题难处理的地方是边界情况的判断。那么我们就可以反过来,先处理边界情况的连通块,先对四条边进行一次遍历,先把边上的连通块都找到,将其修改为无关的字符。接下来只需要遍历(此时不需要再BFS或DFS)矩阵,将矩阵中剩下的的O修改为X,最后再把 . 修改为O即可。因为把边界情况处理过后,此时剩下的O一定都是被包围的。
代码实现
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 j = 0; j < n; j++){if(board[0][j] == 'O') bfs(board, 0, j);if(board[m - 1][j] == 'O') bfs(board, m - 1, j);}for(int i = 0; i < m; i++){if(board[i][0] == 'O') bfs(board, i, 0);if(board[i][n - 1] == 'O') bfs(board, i, n - 1);}// 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 bfs(vector<vector<char>>& board, int i, int j){queue<pair<int, int>> q;q.push({i, j});board[i][j] = '.';while(q.size()){auto [a, b] = q.front();q.pop();for(int k = 0; k < 4; k++){int x = a + dx[k], y = b + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'O'){q.push({x, y});board[x][y] = '.';}}}}
};
相关文章:
算法——BFS解决FloodFill算法
什么是FloodFill算法 中文:洪水灌溉。假设这一块4*4的方格是一块土地,有凸起的地方,也有凹陷的地方(凹陷的地方用负数表示)。此时下大雨发洪水,会把凹陷的地方填满。绿色圈起来的属于一块区域(…...
【Linux】常用的基本命令指令②
前言:前面我们学习了Linux的部分指令,今天我们将接着上次的部分继续将Linux剩余的基本指令. 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏分类:Linux的学习 👈 💯代码仓库:卫卫周大胖的学习日记…...
52、全连接 - 特征与样本空间的对应关系
上一节说到经过全连接层之后,神经网络学习到的特征,会从隐层特征空间逐步映射到样本空间,这主要是由于全连接层可以融合全局的特征。 在经过全连接层之后,在 ResNet50 这个神经网络中会输出1000个特征的得分值,这1000个特征的得分值,便可以对应到图像的分类。 怎么对应…...
Go语言中的包管理工具之Go Vendor的使用
GoLang 中常用的包管理的方式 常用的有三种 Go PathGo VendorGo Modules 关于 Go Vender 1 )概述 在2015年的时候,我们的另一个包管理工具Go Vendor就诞生了它诞生于 2015.8.19 ,是在Go的 1.5 版本当中引入的,它默认是关闭的我…...
QString设置小数点精度位数
QString设置小数点精度位数 Chapter1 QString设置小数点精度位数Chapter2 Qt中QString.toDouble有效位数6位问题以及数据小数点有效位数的处理问题一:QString.toDouble有效位只有6位问题二:小数点有效位数的问题 Chapter3 qt QString转Double只显示6位数字的问题(精…...
基于Java驾校预约管理系统
基于Java的驾校预约管理系统是一个为驾校提供在线预约服务的系统。该系统利用Java编程语言,采用SSM框架,并使用MySQL数据库进行开发。 这个系统主要有三个角色:用户、教练和管理员。 用户可以注册和登录系统,查看驾校的公告信息…...
C++面向对象高级编程(侯捷)笔记2
侯捷C面向对象高级编程 本文是学习笔记,仅供个人学习使用,如有侵权,请联系删除。 如果你对C面向对象的组合、继承和委托不了解,对什么是拷贝构造、什么是拷贝赋值和析构不清楚,对类设计中的Adapter、pImpl、Template…...
双曲正弦函数(*) 优化麦克劳林公式
#include<stdio.h> #include<math.h> int main() {double x,eps,i3,y,item;scanf("%lf%lf",&x,&eps);yx;itemx;while(fabs(item)>eps){itemitem*x*x/i/(i-1);i2;yitem;}printf("%.6f\n",y);return 0; }...
无监督关键词提取算法:TF-IDF、TextRank、RAKE、YAKE、 keyBERT
TF-IDF TF-IDF是一种经典的基于统计的方法,TF(Term frequency)是指一个单词在一个文档中出现的次数,通常一个单词在一个文档中出现的次数越多说明该词越重要。IDF(Inverse document frequency)是所有文档数比上出现某单词的个数,通常一个单词…...
web3 : blockscout剖析
Blockscout 是第一个功能齐全的开源区块链浏览器,可供任何以太坊虚拟机 (EVM) 链使用。项目方可以下载并使用Blockscout作为其链的浏览器,用户可以轻松验证交易、余额、区块确认、智能合约和其他记录。 目录 Blockscout可以做什么主要特征blockscoutDocker容器组件Postgres 1…...
【机器学习基础】DBSCAN
🚀个人主页:为梦而生~ 关注我一起学习吧! 💡专栏:机器学习 欢迎订阅!相对完整的机器学习基础教学! ⭐特别提醒:针对机器学习,特别开始专栏:机器学习python实战…...
计算机硬件 4.4键盘与鼠标
第四节 键盘与鼠标 一、认识键盘 1.地位:计算机系统最基本的输入设备。 2.外观结构:面板、键帽、底盘、数据线。 3.组成键区:主键区、功能键区、辅助键区和编辑(控制)键区。 二、键盘分类 1.按接口分 ①AT口&…...
Flappy Bird QDN PyTorch博客 - 代码解读
Flappy Bird QDN PyTorch博客 - 代码解读 介绍环境配置项目目录结构QDN算法重要函数解读preprocess(observation)DeepNetWork(nn.Module)BirdDQN类主程序部分 介绍 在本博客中,我们将介绍如何使用QDN(Quantile Dueling Network)算法…...
听GPT 讲Rust源代码--compiler(9)
File: rust/compiler/rustc_trait_selection/src/traits/select/mod.rs 在Rust源代码中,rust/compiler/rustc_trait_selection/src/traits/select/mod.rs文件的作用是实现Rust编译器的trait选择器。 首先,让我们逐个介绍这些struct的作用: Se…...
Go语言中关于go get, go install, go build, go run指令
go get go get 它会执行两个操作 第一个, 是先将远程的代码克隆到Go Path的 src 目录那二个, 是执行go install命令 那如果指定的包可以生成二进制文件那它就会把这个二进制文件保存到这个 Go Path 的bin目录下面这是 go install 命令执行的操作 如果只需要下载包,…...
石头剪刀布游戏 - 华为OD统一考试
OD统一考试 分值: 100分 题解: Java / Python / C++ 题目描述 石头剪刀布游戏有 3 种出拳形状: 石头、剪刀、布。分别用字母 A,B,C 表示游戏规则: 出拳形状之间的胜负规则如下: A>B; B>C; C>A; 左边一个字母,表示相对优势形状。右边一个字母,表示相对劣势形状。…...
【北亚服务器数据恢复】ZFS文件系统服务器ZPOOL下线的数据恢复案例
服务器数据恢复环境: 服务器中有32块硬盘,组建了3组RAIDZ,部分磁盘作为热备盘。zfs文件系统。 服务器故障: 服务器运行中突然崩溃,排除断电、进水、异常操作等外部因素。工作人员将服务器重启后发现无法进入操作系统。…...
C# 反射的终点:Type,MethodInfo,PropertyInfo,ParameterInfo,Summry
文章目录 前言反射是什么?常用类型操作SummryPropertyInfoMethodInfo无参函数运行 有参函数运行,获取paramterInfo 总结 前言 我之前写了一篇Attribute特性的介绍,成功拿到了Attribute的属性,但是如果把Attribute玩的溜,那就要彻…...
2020年认证杯SPSSPRO杯数学建模D题(第一阶段)让电脑桌面飞起来全过程文档及程序
2020年认证杯SPSSPRO杯数学建模 D题 让电脑桌面飞起来 原题再现: 对于一些必须每天使用电脑工作的白领来说,电脑桌面有着非常特殊的意义,通常一些频繁使用或者比较重要的图标会一直保留在桌面上,但是随着时间的推移,…...
谷歌推出创新SynCLR技术:借助AI生成的数据实现高效图像建模,开启自我训练新纪元!
谷歌推出了一种创新性的合成图像框架,这一框架独特之处在于它完全不依赖真实数据。这个框架首先从合成的图像标题开始,然后基于这些标题生成相应的图像。接下来,通过对比学习的技术进行深度学习,从而训练出能够精准识别和理解这些…...
Vue2中使用echarts,并从后端获取数据同步
一、安装echarts npm install echarts -S 二、导入echarts 在script中导入,比如: import * as echarts from "echarts"; 三、查找要用的示例 比如柱状图 四、初始化并挂载 <template><div id"total-orders-chart" s…...
【Redux】自己动手实现redux-thunk
1. 前言 在原始的redux里面,action必须是plain object,且必须是同步。而我们经常使用到定时器,网络请求等异步操作,而redux-thunk就是为了解决异步动作的问题而出现的。 2. redux-thunk中间件实现源码 function createThunkMidd…...
ElasticSearch使用Grafana监控服务状态-Docker版
文章目录 版本信息构建docker-compose.yml参数说明 创建Prometheus配置文件启动验证配置Grafana导入监控模板模板说明 参考资料 版本信息 ElasticSearch:7.14.2 elasticsearch_exporter:1.7.0(latest) 下载地址:http…...
VS Code 如何调试Python文件
VS Code中有1,2,3处跟Run and Debug相关的按钮, 1 处:调试和运行就不多说了,Open Configurations就是打开workspace/.vscode下的lauch.json文件,而Add Configuration就是在lauch.json文件中添加当前运行Python文件的Configuratio…...
day06、SQL语言之概述
SQl 语言之概述 6.1 SQL语言概述6.2 SQL语言之DDL定义数据库6.3 SQL语言之DML操纵数据库 6.1 SQL语言概述 6.2 SQL语言之DDL定义数据库 6.3 SQL语言之DML操纵数据库...
3D目标检测(教程+代码)
随着计算机视觉技术的不断发展,3D目标检测成为了一个备受关注的研究领域。与传统的2D目标检测相比,3D目标检测可以在三维空间中对物体进行定位和识别,具有更高的准确性和适用性。本文将介绍3D目标检测的相关概念、方法和代码实现。 一、3D目…...
让设备更聪明 |启英泰伦离线自然说,开启智能语音交互新体验!
语音交互按部署方式可以分为两种:离线语音交互和在线语音交互。 在线语音交互是将数据储存在云端,其具备足够大的存储空间和算力,可以实现海量的语音数据处理。 离线语音交互是以语音芯片为载体,语音数据的采集、计算、决策均在…...
React Hooks之useState、useRef
文章目录 React Hooks之useStateReact HooksuseStatedemo:在函数式组件中使用 useState Hook 管理计数器demo:ant-design-pro 中EditableProTable组件使用 useRef React Hooks之useState React Hooks 在 React 16.8 版本中引入了 Hooks,它是…...
提供电商Api接口-100种接口,淘宝,1688,抖音商品详情数据安全,稳定,支持高并发
Java是一种高级编程语言,由Sun Microsystems公司于1995年推出,现在属于Oracle公司开发和维护。Java以平台无关性、面向对象、安全性、可移植性和高性能著称,广泛用于桌面应用程序、嵌入式系统、企业级服务、Android移动应用程序等。 接口是Ja…...
git的使用 笔记1
GIT git的使用 使用git提交的两步 第一步:是使用 git add 把文件添加进去,实际上就是把文件添加到暂存区。第二步:使用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支上。 .git 跟踪管理版本的目录 创建版本库…...
嘉兴公司网站模板建站/开发一个网站的步骤流程
2011年是个不同寻常的一年,专科大二了充满着迷茫、但是抱着对未来充满希望的来到了提高班;2012年锐变着、成熟了、强大着、收获着…… 这一年的全局图: 思想上:来到在提高班体会最深的就是:学习如何为人处事、先学会做人再谈学问、…...
wordpress 评论模块/自己搭建一个网站
作为简易机器人制作中的重要零部件,多分量力传感器对提高整体设计水平、完善内部的组织框架起到了关键作用。本文结合简易机器人的设计要求,对多传感器的应用进行了一番探究。一、什么是多分量力传感器多分量力传感器又叫多维力传感器,包括二分量力传感器、三分量力…...
有哪些好的模板网站/seo优化技巧有哪些
转自:http://blog.csdn.net/zhuzhihai1988/article/details/7843186 1.如果是在打开的文档范围内:查找: Command F替换: OptionCommandFReplace All 是全部替换本文档范围内的字符串Replace 是替换当前字符串Replace & Find…...
重庆农村网站建设/旺道seo营销软件
前言这个是我花49c币在csdn上下载的,稍微做了些修改,给大家分享一下。觉得还不错的点个赞吧。先上执行完毕后的控制台输出截图:package com.dq.utils;import java.math.BigDecimal;import java.math.BigInteger;import java.math.RoundingMod…...
web的网站开发/网站搭建一般要多少钱
本章节扩展一些目录和文件操作的更多知识,因为这些知识涉及到时间操作,所以放在时间操作之后的章节中介绍。一、access库函数access函数用于判断当前操作系统用户对文件或目录的存取权限。包含头文件:#include 函数声明:int acces…...
wordpress 会员vip/北京seo顾问外包
PAGEPAGE 27课程设计任务书学生姓名: 专业班级:指导教师: 工作部门:一、课程设计题目《控制系统建模、分析、设计和仿真》本课程设计共列出10个同等难度的设计题目,编号为:[0号题]、[1号题]、[2号题]、[3号…...