【刷题22】BFS解决最短路问题
目录
- 一、边权为1的最短路问题
- 二、迷宫中离入口最近的出口
- 三、最小基因变化
- 四、单词接龙
- 五、为高尔夫比赛砍树
一、边权为1的最短路问题
如图:从A到I,怎样走路径最短
- 一个队列+一个哈希表
- 队列:一层一层递进,直到目的地为止
- 哈希表:记录当前位置是否经过,经过的就不用再进队列
- 为什么可以使用BFS?因为每条边的长度为1,同样的速率走,走相同的步频,谁先到目的地,谁的路径就是最短的
二、迷宫中离入口最近的出口
题目:
思路:BFS+哈希表 找最短路径
- 能到边界,返回ret,ret是层数
- 不能到边界,队列层序结束,返回-1
- 必须是某个位置的上下左右为边界才符合条件,即使刚开始就在边界也不行,也必须要移动,移动到另一个边界上才算;否则队列循环结束也是返回-1,参考示例2和示例3
代码:
class Solution {
public:int bx[4] = {-1,1,0,0};int by[4] = {0,0,-1,1};bool hash[100][100] = {false};int nearestExit(vector<vector<char>>& maze, vector<int>& entrance) {int n = maze.size();int m = maze[0].size();int ret = 0;queue<pair<int, int>> q;q.push({entrance[0], entrance[1]});while(!q.empty()){int k = q.size();ret++;// 一层的个数while(k--){int x1 = q.front().first;int y1 = q.front().second;// 防止重复if(hash[x1][y1]){q.pop();continue;}for(int i=0; i<4; i++){int x2 = x1+bx[i];int y2 = y1+by[i];if(x2>=0&&x2<n&&y2>=0&&y2<m&&maze[x2][y2]=='.'&&!hash[x2][y2]){if(x2==0 || x2==n-1 || y2==0 || y2==m-1){return ret;}q.push({x2, y2});}}// 标记经过的位置 更新队列hash[x1][y1] = true;q.pop();}}return -1;}
};
三、最小基因变化
题目:
题目理解:
- 一次变化相当于步数,所以可以用BFS
- 最终要变化成的基因序列必须是基因库中存在的,否则返回-1
- 每一次的变化,也必须是在基因库中存在的,否则返回-1
思路:BFS+哈希表
- 两个哈希表,一个标记基因库中有的基因序列,后续要使用(判断每次变化是否在基因库中);另一个标记是否已经出现过,防止重复
- start字符串与end字符串相同,直接返回0
- end字符串不在基因库中,直接返回-1
- BFS:一个队列,层序遍历,一层就是一次变化
- 基因序列如何变化?题目是字符串有8个字符,所以每个位置的字符变化一次,变化的字符有4个:ACGT
- 只要在基因库中存在并且没有出现过,就入队列,如果该字符串与end字符串相同,就直接返回ret
- 细节:变化前(内循环外面),先用一个临时字符串代替,这样保证只修改了一次;否则变化到后面,前面的也都变化了,就不止修改了一次
- 队列层序完,没有end字符串等于tmp(变化的字符串),就说明start字符串变化不到end字符串,最终返回-1
代码:
class Solution {
public:int minMutation(string startGene, string endGene, vector<string>& bank) {unordered_map<string, int> hash; // 标记基因库中出现过的for(auto &e : bank) hash[e]++;unordered_map<string, int> vis; // 标记每次变化是否出现过 防止重复// 如果刚开始就相同if(startGene == endGene) return 0;// endGene不在基因库中if(hash[endGene] == 0) return -1;// 变化的字符string change = "ACGT";queue<string> q;int ret = 0; // 层数就是变化次数q.push(startGene);while(!q.empty()){int k = q.size();ret++;while(k--){string t = q.front();// 获取队列头vis[t]++;// 标记已经出现q.pop();// 删除for(int i=0; i<8; i++){string tmp = t;// 临时的,保证只修改一次for(int j=0; j<4; j++){tmp[i] = change[j];// 对应位置修改// 在基因库中存在并且还没出现过if(hash[tmp] > 0 && vis[tmp] == 0){q.push(tmp);// 等于最终的字符串 返回if(tmp == endGene){return ret;}}}}}}return -1;}
};
四、单词接龙
题目:
思路:BFS+哈希表
- 本题与上题思路和过程几乎相同,字符=》字符串。以下是不同的地方要注意:
- 都是一次改变,改变的是字符串中的一个字符,上题是ACGT,本题是wordList中出现的单词的所有字符,记得要去重。
- 接下来是用队列完成层序遍历,与上题几乎一样,不同点:取队头元素时,要判断它是否出现过,出现过了就删除队头元素,然后continue(注意:其实加这个是为了避免重复计算,本题如果少了这个条件会超时;上题没有加这个条件并没有超时);因为wordList中每个单词的长度是一样的,所以外循环是单词的长度(在上题是固定的,为8的字符);内循环是要变化的字符的个数,就是change字符串(set去重后的),上题是固定的ACGT,为4个字符。其他是一样的。
- 返回值:不符合条件是返回0;符合条件是返回单词接龙的长度,不是层数,单词接龙的长度就是层数+1,即返回ret+1
代码:
class Solution {
public:int ladderLength(string beginWord, string endWord, vector<string>& wordList) {unordered_map<string, int> hash;for(auto &e : wordList) hash[e]++;unordered_map<string, int> vis;if(beginWord == endWord) return 0;if(hash[endWord] == 0) return 0;// 要变化的字符string str;for (auto& e : wordList){str += e;}set<char> se(str.begin(), str.end());string change(se.begin(), se.end());//queue<string> q;int ret = 0;q.push(beginWord);while(!q.empty()){int k = q.size();ret++;while(k--){string t = q.front();if(vis[t] > 0){q.pop();continue;}vis[t]++;q.pop();for(int i=0; i<wordList[0].size(); i++){string tmp = t;for(int j=0; j<change.size(); j++){tmp[i] = change[j];if(hash[tmp] > 0 && vis[tmp] == 0){q.push(tmp);if(tmp == endWord){return ret+1;}} }}}}return 0;}
};
五、为高尔夫比赛砍树
题目:
思路:BFS+哈希表
- 把二维数组中所有大于1的元素排序,每次找的元素根据排序从小到大,如上图所示,找一次相当于找一个树的最短路径,所以本题等价于多个迷宫找出口
- 注意:是要找最小的树,然后再根据顺序往上找其他树,并不是说一定要从1开始找,因为1是地面,只是上面的栗子刚好起始点就是1;如果1和4交换,千万不能从4开始走到1,再去找2,这是错的;【0,0】是4,或者说不管是多少,直接去找最小的树就行了(上面的栗子最小的树是2);如果【0,0】起始点就是最小的树,也不影响,代码中有加判断跳过,然后找次小的树(次小的树这时变成最小的树),剩下找的过程是正常的(总之:开始找最小的树ret开始计算)
- 最后flag的处理问题:只要有走到目标树,就不会经过最后的flag,如果有经过最后的flag,说明无路可走(周围都是围墙),这时就有可能还有树没有砍掉,结果返回-1;但是有一个情况例外,当只剩下一个树了,那它周围也就没有树了,会经过flag,可是这种情况是对的,不能当作错误的情况处理;可以加个条件:下标i 等于gsz时,代表是最后一个树,不进入flag的处理
代码:
class Solution {
public: int ret = 0;// 返回值-步数int flag = 0;// 标记-是否将所有的树砍掉int n, m;// 矩阵行列int gx = 0, gy = 0;// 开始的位置,后面会更新int i = 0;// 下标-从小到大int gsz = 0;// 树的个数int bx[4] = {-1,1,0,0};int by[4] = {0,0,-1,1};int cutOffTree(vector<vector<int>>& forest) {if(forest[gx][gy] == 0) return -1;n = forest.size();m = forest[0].size();vector<int> v;for(int i=0; i<n; i++){for(int j=0; j<m; j++){if(forest[i][j] > 1)// 找树{v.push_back(forest[i][j]);}}}sort(v.begin(), v.end());// 从最小的树开始,或者找到最小树int sz = v.size();gsz = sz;// 全局的树的个数while(sz--){bfs(forest, v[i]);if(flag == 1) return -1;// 还有树没有砍完i++;// 到下一个树}return ret;}void bfs(vector<vector<int>>& forest, int tar){if(tar == forest[gx][gy])// 要找的树就是当前位置{return;}// 不是全局的,每次层序要更新(找一个树)bool vis[50][50] = {false};queue<pair<int, int>> q;q.push({gx, gy});while(!q.empty()){int k = q.size();ret++;while(k--){int x1 = q.front().first;int y1 = q.front().second;if(vis[x1][y1])// 防止重复{q.pop();continue;}q.pop();vis[x1][y1] = true;for(int i=0;i<4;i++){int x2 = x1+bx[i];int y2 = y1+by[i];if(x2>=0&&x2<n&&y2>=0&&y2<m&&forest[x2][y2]!=0&&!vis[x2][y2]){q.push({x2, y2});// 找到目标树if(forest[x2][y2] == tar){gx = x2;// 更新,下次就是从该位置开始gy = y2;return;}}}}}if(i != gsz-1) // 最后一个flag = 1;}
};
相关文章:
【刷题22】BFS解决最短路问题
目录 一、边权为1的最短路问题二、迷宫中离入口最近的出口三、最小基因变化四、单词接龙五、为高尔夫比赛砍树 一、边权为1的最短路问题 如图:从A到I,怎样走路径最短 一个队列一个哈希表队列:一层一层递进,直到目的地为止哈希表&…...
服务器重启:数字世界的短暂休憩与新生
在互联网的浩瀚海洋中,服务器犹如一座座灯塔,持续稳定地散发着光芒,为无数的网络活动提供着支撑与指引。而服务器重启,便是这数字灯塔周期性进行自我调整与修复的关键环节。 服务器重启是指对服务器进行重新启动的过程࿰…...
JavaEE 【知识改变命运】05 多线程(4)
文章目录 单例模式什么是单例模式饿汉模式懒汉模式多线程- 懒汉模式分析多线程问题第一种添加sychronized的方式第二种添加sychronized的方式改进第二种添加sychronized的方式(DCL检查锁) 阻塞队列什么是阻塞队列什么是消费生产者模型标准库中的阻塞队列…...
【CSS in Depth 2 精译_076】12.4 @font-face 的工作原理
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第四部分 视觉增强技术 ✔️【第 12 章 CSS 排版与间距】 ✔️ 12.1 间距设置 12.1.1 使用 em 还是 px12.1.2 对行高的深入思考12.1.3 行内元素的间距设置 12.2 Web 字体12.3 谷歌字体12.4 font-fac…...
SQL Having用法
拿个业务场景说这个案例,比如我们有个表里面可能有批改过的数据,批改过得数据不会随着新批改的数据覆盖,而是逐条插入表中,如果想找出包含最早批改的数据和最新批改数据的话,那么我们就需要用到了havinng 用法,假设最开…...
@JsonNaming实现入参接口参数下划线驼峰自动转换
JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) 是用于 Jackson 库中的一个注解,作用是改变 Java 对象的字段命名策略,特别是在序列化和反序列化时。这可以帮助 Java 对象中的字段名从驼峰命名法(CamelCase)转换为蛇…...
使用PaliGemma2构建多模态目标检测系统:从架构设计到性能优化的技术实践指南
目标检测技术作为计算机视觉领域的核心组件,在自动驾驶系统、智能监控、零售分析以及增强现实等应用中发挥着关键作用。本文将详细介绍PaliGemma2模型的微调流程,该模型通过整合SigLIP-So400m视觉编码器与Gemma 2系列的高级语言模型,专门针对…...
MinerU:PDF文档提取工具
目录 docker一键启动本地配置下载模型权重文件demo.pyGPU使用情况 wget https://github.com/opendatalab/MinerU/raw/master/Dockerfile docker build -t mineru:latest .docker一键启动 有点问题,晚点更新 本地配置 就是在Python环境中配置依赖和安装包 根据需求…...
spark的共享变量
因为RDD在spark中是分布式存储 1、python中定义的变量仅仅在driver中运行,在excutor中是获取不到值的——广播变量 2、若定义了一个变量进行累加,先分别在driver和excutor中进行累加,但是结果是不会主动返回给driver的——累加器 Broadcas…...
Scrapy与MongoDB
Scrapy可以在非常短的时间里获取大量的数据。这些数据无论是直接保存为纯文本文件还是CSV文件,都是不可取的。爬取一个小时就可以让这些文件大到无法打开。这个时候,就需要使用数据库来保存数据了。 MongoDB由于其出色的性能,已经成为爬虫的首…...
爬虫基础与实践
爬虫技术基础与实践 在当今数字化的时代,数据成为了宝贵的资源。爬虫技术作为获取数据的重要手段,受到了广泛的关注和应用。本文将介绍爬虫的基本概念、工作原理以及一些常用的技术和工具。 一、爬虫的基本概念 爬虫,也称为网络蜘蛛或网络机器…...
快速上手Serverless架构与FastAPI结合实现自动化移动应用后端
快速上手Serverless架构与FastAPI结合实现自动化移动应用后端 引言 随着云计算技术的发展,Serverless架构已经成为构建现代应用的一种流行选择。它允许开发者将更多精力集中在核心业务逻辑上,而无需管理底层基础设施。本文将以AWS Lambda和API Gateway…...
ansible自动化运维(二)playbook模式详解
一.Ansible中的playbook模式 Playbook不同于使用单个模块操作远程服务器,Playbook的功能更加强大。如果说单个模块执行类似于Linux系统中的命令,那么Playbook就类似于shell脚本,将多个模块组合起来实现一组的操作。 Playbook还是会用到ad-h…...
基于Springboot社团管理系统【附源码】
基于Springboot社团管理系统 效果如下: 系统登录页面 用户管理页面 社团信息管理页面 社团活动管理页面 经费信息管理页面 新闻信息管理页面 系统主页面 社团信息页面 研究背景 在当今高校与社区环境中,学生社团蓬勃发展,成为学生课余生活…...
CSS:html中,.png的动态图,怎么只让它显示部分,比如只显示右上部分的,或右边中间部分
目录 背景 方法 1: 使用 background-image 和 background-position 示例代码 解释 方法 2: 使用 clip-path 裁剪图像 示例代码 解释 方法 3: 使用 object-fit 和 overflow 示例代码 解释 示例 总结 背景 在HTML中,如果你有一个 .png 的动态图(例如一个 GIF 动画或…...
解读CVPR2024-论文分享|RepViT: Revisiting Mobile CNN From ViT Perspective
论文标题 RepViT: Revisiting Mobile CNN From ViT Perspective 论文链接: https://arxiv.org/abs/2307.09283 论文作者 Ao Wang, Hui Chen, Zijia Lin, Jungong Han, Guiguang Ding 内容简介 这篇论文探讨了在资源受限的移动设备上,轻量级视觉变…...
linux部署安装wordpress
一、环境准备 首先我们先介绍下环境和实验中所需要的包 环境: 我使用的是centos7.6的系统 建议关掉selinux和影响到80端口的防火墙策略 selinux永久有效 修改 /etc/selinux/config 文件中的 SELINUX"" 为 disabled ,然后重启。 selinux即…...
[Java] 配置Powershell 的 Maven 环境变量
目录 前言单独为 Powershell 设置 Maven 环境变量 前言 安装使用 maven 的时候发现,明明已经配置好了环境变量。但是在 powershell 中还是无法识别 mvn 命令。原来这货需要另外配置。 单独为 Powershell 设置 Maven 环境变量 要在 PowerShell 中永久配置 Maven 环…...
Android -- [SelfView] 自定义弹窗式颜色选择器
Android – [SelfView] 自定义弹窗式颜色选择器 PS: 1. 弹框式显示; 2. 支持透明度设置; 3. 支持拖动控件选择颜色; 4. 支持 ARGB | HEX 数值填写预览颜色并返回; 5. 输出支持Hex 和 Int 两种格式;效果 使用方法&…...
vue-echarts高度缩小时autoresize失效
背景 项目中采用动态给x-vue-echarts style赋值width,height的方式实现echarts图表尺寸的改变 <v-chart...autoresize></v-chart>给v-chart添加autoresize后,在图表宽度变化,高度增加时无异常,高度减小时图表并未缩…...
rabbitMq的rabbitmqctl status报错
Error: unable to perform an operation on node rabbitASUS-PC. Please see diagnostics information and suggestions below. 遇到上图这个错大部分问题可能是由于 RabbitMQ CLI 工具的 Erlang Cookie 与服务器上的不匹配而导致连接问题。Erlang Cookie 在 RabbitMQ 节点之间…...
linux c++ uuid编译时的问题
linux c uuid编译时的问题 写在前面可能编译过和不能编译过的可以编译和link过的不能编译过的 写在前面 几次翻车与uuid相关,超出我认知。 所以,把一些遇到的相关问题写在这里。 可能编译过和不能编译过的 可以编译和link过的 cmake_minimum_require…...
【STM32】RTT-Studio中HAL库开发教程九:FLASH中的OPT
文章目录 一、概要二、内部FLASH排布三、内部FLASH主要特色四、OTP函数介绍五、测试验证 一、概要 STM32系列是一款强大而灵活的微控制器,它的片内Flash存储器可以用来存储有关代码和数据,在实际应用中,我们也需要对这个存储器进行读写操作。…...
[SWPUCTF 2021 新生赛]crypto9
[MoeCTF 2021]Web安全入门指北—GET 意思是GET传参,moeflag 就可以得到falg 输入?moeflag flag为: NSSCTF{ff26110b-8793-403c-990e-15c7f1820596} [SWPUCTF 2021 新生赛]crypto9 #gpt写的代码 from itertools import product letter_list ABCDEFG…...
vue中常用的指令
v - if 指令 功能详细解释 它是一种真正的条件渲染指令。在 Vue 实例初始化以及数据更新过程中,Vue.js 会对v - if指令中的表达式进行求值。这个表达式可以是简单的布尔变量,也可以是一个复杂的计算表达式,只要最终结果是布尔值就行。当表达式…...
Docker Compose实战三:轻松部署PHP
通过前面的文章(Docker Compose基础语法与MySQL部署),你已经掌握了Docker Compose的基本语法和常用指令,并成功部署了一个MySQL数据库服务器。今天,我们将继续深入探索Docker Compose的强大功能,介绍如何使…...
数据分析实战—房价特征关系
1.实战内容 (1) 读取房价特征关系表(house_price.npz)绘制离地铁站的距离与单位面积的房价的散点图,并对其进行分析; import pandas as pd import numpy as np import warnings warnings.filterwarnings(&…...
云和恩墨 zCloud 与华为云 GaussDB 完成兼容性互认证
近日,云和恩墨(北京)信息技术有限公司(以下简称:云和恩墨)的多元数据库智能管理平台 zCloud 与华为云计算技术有限公司(以下简称:华为云)的 GaussDB 数据库完成了兼容性互…...
【大语言模型LangChain】 ModelsIO OutputParsers详解
【大语言模型LangChain】 ModelsIO OutputParsers详解 一、简介二、OutputParsers 的优势三、解析器类型四、实战示例1、String 解析器2、Json 解析器3、Pydantic 解析器4、结构化输出解析器5、OpenAI 函数输出解析器5.1、JsonOutputFunctionsParser5.2、JsonKeyOutputFunction…...
PaddleSpeech本地部署文档
windows安装paddlespeech步骤: 1. 安装vs c编译环境 对于 Windows 系统,需要安装 Visual Studio 来完成 C 编译环境的安装。 Microsoft C Build Tools - Visual Studio 2. 安装conda conda create -y -p paddlespeech python3.8 conda activate pad…...
做网站能做职业吗/seo博客教程
f5 刷新页面 page——load事件,用if(!IsPostBack)也可以避免F5 刷新...
web个人博客网站/快速排名提升
上一篇文章把整个系统的主界面实现了,接下来就是实现主界面上提供的各个功能模块。首先介绍的是通用数据管理模块,为什么称为通用数据呢?因为这些数据和我们平时使用关系型数据库管理的数据是类似的,这里称为通用数据主要是为了和…...
沈阳网站建设21anshan/如何制作网页教程
背景框架是前端面试中的常客。尤其是 React 和 Vue。React 和 Vue 这两个极其优秀的前端类库,基本上占据了前端开发的半壁江山。如果把这两个神仙框架放在一起比较一下, 一定会发现一些比较有意思的知识点。掌握这些知识点, 并灵活运用&#…...
做pc端网站必知/技能培训网站
快要到秋招了,对于应届生来说,秋招是一个特别重要的机会。对于社招同学来说,金九银十也是一个很好的跳槽窗口。 而我呢,因为是从上海到广州工作,就没有提前先把工作定下来。刚好也趁这个机会出去旅游了两个月。 旅游…...
网店开店流程步骤/谷歌seo怎么优化
一、先凑整,再补零例如:17 34 ----> 20 30 50 --> 50 1 51二、利用数字的特征例如 17 x 23 ---> (20 - 3) x (20 3) 400 - 9 391三、记住一下开方 1 ~ 10的开方 根号 1 1 根号 6 2.44…...
互联网保险监管/吉林关键词排名优化软件
本文作者戴尔伍德(Dale Woods)2007年开始交易外汇,是一名外汇“发烧友”,尤其偏爱价格运动(Price Action)分析,至今拥有12年的交易经验。在这十多年的交易生涯中,伍德一直对价格运动…...