BFS 解决最短路问题详解

news2024/9/28 15:47:24

BFS 解决最短路问题

    • 题目一:迷宫中离⼊⼝最近的出⼝
      • 1. 题⽬链接:
      • 2. 题⽬描述:
      • 3.算法思路:
      • 4.代码
    • 题目二. 最⼩基因变化
      • 1. 题⽬链接:
      • 2. 题⽬描述:
      • 3.算法思路:
      • 4.代码
    • 题目三:单词接⻰
      • 1. 题⽬链接:
      • 2. 题⽬描述:
      • 3.算法思路:
      • 4.代码

题目一:迷宫中离⼊⼝最近的出⼝

1. 题⽬链接:

https://leetcode.cn/problems/nearest-exit-from-entrance-in-maze/description/

2. 题⽬描述:

给你⼀个 m x n 的迷宫矩阵 maze (下标从 0 开始),矩阵中有空格⼦(⽤ ‘.’ 表⽰)和墙(⽤ ‘+’ 表
⽰)。同时给你迷宫的⼊⼝ entrance ,⽤ entrance = [entrancerow, entrancecol] 表⽰你⼀开始所在格⼦的⾏和列。 每⼀步操作,你可以往 上,下,左 或者 右 移动⼀个格⼦。你不能进⼊墙所在的格⼦,你也不能离开 迷宫。你的⽬标是找到离 entrance 最近 的出⼝。出⼝ 的含义是 maze 边界 上的 空格⼦。 entrance 格⼦ 不算 出⼝。 请你返回从 entrance 到最近出⼝的最短路径的 步数 ,如果不存在这样的路径,请你返回 -1 。

在这里插入图片描述

3.算法思路:

利⽤层序遍历来解决迷宫问题,是最经典的做法。 我们可以从起点开始层序遍历,并且在遍历的过程中记录当前遍历的层数。这样就能在找到出⼝的
时候,得到起点到出⼝的最短距离。

4.代码

class Solution 
{
 int[] dx = {0, 0, -1, 1};

 int[] dy = {1, -1, 0, 0};
 public int nearestExit(char[][] maze, int[] e) 
 {
 int m = maze.length, n = maze[0].length;
 boolean[][] vis = new boolean[m][n];
 Queue<int[]> q = new LinkedList<>();
 q.add(new int[]{e[0], e[1]});
 vis[e[0]][e[1]] = true;
 int step = 0;
 while(!q.isEmpty())
 {
 step++;
 int sz = q.size();
 for(int i = 0; i < sz; i++)
 {
 int[] t = q.poll();
 int a = t[0], b = t[1];
 for(int j = 0; j < 4; j++)
 {
 int x = a + dx[j], y = b + dy[j];
 if(x >= 0 && x < m && y >= 0 && y < n && maze[x][y] == '.' 
&& !vis[x][y])
 {
 // 判断是否已经到出⼝ 
 if(x == 0 || x == m - 1 || y == 0 || y == n - 1) return

 step;
 vis[x][y] = true;
 q.add(new int[]{x, y});
 }
 }
 }
 }
 return -1;
 }
}

题目二. 最⼩基因变化

1. 题⽬链接:

https://leetcode.cn/problems/minimum-genetic-mutation/description/

2. 题⽬描述:

基因序列可以表⽰为⼀条由 8 个字符组成的字符串,其中每个字符都是 ‘A’ 、 ‘C’ 、 ‘G’ 和 ‘T’ 之⼀。
假设我们需要调查从基因序列 start 变为 end 所发⽣的基因变化。⼀次基因变化就意味着这个 基因序列中的⼀个字符发⽣了变化。

• 例如, “AACCGGTT” --> “AACCGGTA” 就是⼀次基因变化。 另有⼀个基因库 bank
记录了所有有效的基因变化,只有基因库中的基因才是有效的基因序列。(变化后的基因必须位于基因库 bank 中) 给你两个基因序列 start
和 end ,以及⼀个基因库 bank ,请你找出并返回能够使 start 变化为 end 所需的最少变化次数。如果⽆法完成此基因变化,返回
-1 。 注意:起始基因序列 start 默认是有效的,但是它并不⼀定会出现在基因库中。

在这里插入图片描述

3.算法思路:

如果将「每次字符串的变换」抽象成图中的「两个顶点和⼀条边」的话,问题就变成了「边权为 1 的最短路问题」。
因此,从起始的字符串开始,来⼀次 bfs 即可。
每一次转换相当于经过一层,有这么多的情况:可以转换任意一个位置,每个位置可以转换为’A’ 、 ‘C’ 、 ‘G’ 和’T’ 之⼀的任意字符。

4.代码

class Solution 
{
 public int minMutation(String startGene, String endGene, String[] bank) 
 {
 Set<String> vis = new HashSet<>(); // ⽤来标记已经搜索过的状态 
 Set<String> hash = new HashSet<>(); // ⽤来统计基因库⾥⾯的字符串 
 for(String s : bank) hash.add(s);
 char[] change = {'A', 'C', 'G', 'T'};
 if(startGene.equals(endGene)) return 0;
 if(!hash.contains(endGene)) return -1;
 Queue<String> q = new LinkedList<>();
 q.add(startGene);
 vis.add(startGene);
 int step = 0;
 while(!q.isEmpty())
 {
 step++;
 int sz = q.size();
 while(sz-- != 0)
 {
 String t = q.poll();
 for(int i = 0; i < 8; i++)
 {
 char[] tmp = t.toCharArray();
 for(int j = 0; j < 4; j++)
 {
 tmp[i] = change[j];
 String next = new String(tmp);
 if(hash.contains(next) && !vis.contains(next))
 {
 if(next.equals(endGene)) return step;
 q.add(next);
 vis.add(next);
 }
 }
 }
 }
 }
 return -1;
 }
 }

题目三:单词接⻰

1. 题⽬链接:

https://leetcode.cn/problems/word-ladder/description/

2. 题⽬描述:

字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是⼀个按下述规格形成的序 列 beginWord
-> s(1) -> s(2) -> … -> s(k) :

• 每⼀对相邻的单词只差⼀个字⺟。

• 对于 1 <= i <= k 时,每个 s(i) 都在 wordList 中。注意, beginWord 不需要 在 wordList 中。

• s(k) == endWord 给你两个单词 beginWord 和 endWord 和⼀个字典 wordList ,返回 从beginWord 到 endWord 的 最短转换序列 中的 单词数⽬ 。如果不存在这样的转换序列,返回 0

在这里插入图片描述

3.算法思路:

和上一题一样,如果将「每次字符串的变换」抽象成图中的「两个顶点和⼀条边」的话,问题就变成了「边权为 1 的最短路问题」。
因此,从起始的字符串开始,要经过多少层才能转变为目标字符来⼀次 bfs 即可。
每一次转换相当于经过一层,有这么多的情况:可以转换任意一个位置,每个位置可以转换位为’a’到’z’的任意字符。

4.代码

class Solution 
{
 public int ladderLength(String beginWord, String endWord, List<String> 
wordList) 
 {
 Set<String> hash = new HashSet<>();
 for(String s : wordList) hash.add(s);
 Set<String> vis = new HashSet<>(); // 标记已经搜索过的单词 
 if(!hash.contains(endWord)) return 0;
 Queue<String> q = new LinkedList<>();
 q.add(beginWord);
 vis.add(beginWord);
 int ret = 1;
 while(!q.isEmpty())
 {
 ret++;
 int sz = q.size();
 while(sz-- != 0)
 {
 String t = q.poll();
 for(int i = 0; i < t.length(); i++)
 {
 char[] tmp = t.toCharArray();
 for(char ch = 'a'; ch <= 'z'; ch++)
 {
 tmp[i] = ch;
 String next = new String(tmp);
 if(hash.contains(next) && !vis.contains(next))
 {
 if(next.equals(endWord)) return ret;
 q.add(next);
 vis.add(next);
 }
 }
 }
 }
 }
 return 0;
 }
 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2173972.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【WSL安装后,如何互相访问文件系统】

WSL安装后&#xff0c;无法访问linux文件系统 WSL的一个优点就是可以可以直接访问 Windows 文件系统&#xff0c;反之亦然&#xff0c;方便文件共享和操作。 那么安装好以后&#xff0c;WSL的linux文件系统的目录在磁盘哪个位置呢&#xff1f; 在 WSL 中&#xff0c;Linux 文…

【React】react项目中的redux使用

1. store目录结构设计 2. react组件中使用store中的数据——useSelector 3. react组件中修改store中的数据——useDispatch 4. 示例 react-basic\src\store\moduels\counterStore.js import { createSlice } from reduxjs/toolkitconst counterStore createSlice({name: cou…

数据结构-3.5.队列的顺序实现

一.队列的顺序实现&#xff0c;初始化操作以及判断队列是否为空&#xff1a; 1.图解&#xff1a; 2.代码&#xff1a; #include<stdio.h> #define MaxSize 10 //定义一个队列最多存储的元素个数 ​ typedef struct {int data[MaxSize]; //用静态数组存放队列元素int f…

UART 如何实现波特率自动检测原理介绍

为什么需要波特率自动检测机制 我们都知道&#xff0c;串口通讯是需要约定波特率才能够进行准确的通讯。此时假设&#xff0c;你们公司开发了一个板子&#xff0c;有一个串口与外接设备进行通讯。因为你们公司开发的产品要提供给多个客户&#xff0c;而有些客户可能之前就有一…

E9OA解决文档附件没有关联文档正文问题

业务背景&#xff1a; OA通知流程已经提交后在审批中发现漏上传了文档附件。临时放开审批结点文档附件编辑&#xff0c;请审批结点领导将附件上传后再审批。最终在流程中查看可以看到正文和附件&#xff0c;但是在通知文档正文中没有关联文档附件&#xff0c;导致大多数人员在通…

crypto-js解密报错malformed utf-8 data

在进行加解密处理时出现这个问题。 但是当在一个完整程序运行环境内加密字符串&#xff0c;解密字符串是没问题的。 当把加密的字符存储到txt文件&#xff0c;在读取解密时出现错误无法解密。 最后&#xff0c;使用res.replace(/\s/g,‘’)正则过滤掉txt文件内的空格就成功了。…

电商技术选型:Spring Boot在线商城系统

4 系统设计 ONLY在线商城系统的设计方案比如功能框架的设计&#xff0c;比如数据库的设计的好坏也就决定了该系统在开发层面是否高效&#xff0c;以及在系统维护层面是否容易维护和升级&#xff0c;因为在系统实现阶段是需要考虑用户的所有需求&#xff0c;要是在设计阶段没有经…

[ComfyUI]Flux:太美了!古风华服与现代DJ演绎。灼灼荷花瑞,亭亭出水中

大家好我是安琪&#xff01;&#xff01;&#xff01; F.1-汉服人像艺术-国风-氛围感 简介 今天介绍一款Flux LORA模型&#xff1a;F.1-汉服人像艺术-国风-氛围感-liangyi&#xff0c;这是一款以古代汉服女性写真为主题的Flux LORA模型。属于人物主体&#xff0c;增加中国传统…

Java项目实战II基于Java+Spring Boot+MySQL的学院班级回忆录(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 在时光的长河中&#xff0c;班级的记忆如同璀璨星辰&#xff0c;照亮了我们共同的青春岁月。为了珍藏…

Redis篇(应用案例 - 商户查询缓存)

目录 一、什么是缓存? 二、为什么要使用缓存 三、如何使用缓存 四、添加商户缓存 1. 缓存模型和思路 2. 代码如下 五、缓存更新策略 1. 内存淘汰 2. 超时剔除 3. 主动更新 六、数据库缓存不一致解决方案 1. 数据库缓存不一致解决方案 2. 数据库和缓存不一致采用什…

C++之STL—常用集合算法

set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest); // 求两个集合的交集 // **注意:两个集合必须是有序序列** // beg1 容器1开始迭代器 // end1 容器1结束迭代器 // beg2 容器2开始迭代器 // end2 容器2结束迭代器 //…

评估员工绩效的 5 个最佳实践

使用目标。 员工目标是设定期望和评估员工绩效的最有效、最客观的方式。由于目标是在年初或季度初由员工和经理共同制定的&#xff0c;因此双方可以在此过程中讨论他们期望在特定时期内完成的目标&#xff0c;并就成功的样子达成一致。 例如&#xff0c;如果内容营销人员的个人…

代码随想录_刷题笔记_第三次

字符串 — KMP算法&#xff08;理论&#xff09; **解决问题&#xff1a;**字符串匹配的问题&#xff08;eg&#xff1a;文本串 aabaabaaf 模式串 aabaaf 求在文本串中是否出现过模式串&#xff09; **暴力匹配&#xff1a;**当 b 和 f 不匹配时&#xff0c;整体向后跳一位再进…

婚恋交友小程序的设计思路与用户体验优化

在数字化时代&#xff0c;婚恋小程序作为一种新兴的婚恋交友平台&#xff0c;正逐渐成为单身人士寻找伴侣的重要工具。一个优秀的婚恋小程序不仅要有创新的设计思路&#xff0c;还要注重用户体验的优化。编辑h17711347205以下是婚恋小程序的设计思路与用户体验优化的详细阐述&a…

【设计模式】精通高级行为模式:揭秘状态、中介者及其它模式的深层机制

作者&#xff1a;后端小肥肠 &#x1f347; 我写过的文章中的相关代码放到了gitee&#xff0c;地址&#xff1a;xfc-fdw-cloud: 公共解决方案 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; 【设计模式】万字详解…

PDD 各岗位薪资一览表

PDD 昨天聊到 PDD 可能会执行双休政&#xff0c;当中提到了「PDD 的年包在互联网行业中名列前茅」&#xff0c;不少同学一下子来兴趣了。 我这里也从脉脉中找到一份较新的 PDD 各岗位薪资一览表&#xff1a; 注意&#xff0c;这里的平均月薪的计算方式是年收入除以 12&#xff…

U盘打开提示要格式化:深度解析、恢复策略与预防之道

现象透视&#xff1a;U盘遭遇格式化预警 在日常的数字生活中&#xff0c;U盘作为便捷的数据存储与传输工具&#xff0c;扮演着不可或缺的角色。然而&#xff0c;当您满怀期待地插入U盘准备访问数据时&#xff0c;却可能遭遇系统突如其来的提示——“U盘需要格式化才能使用”。…

25考研咨询周开启,西安电子科技大学是否改考408??

学长这几天帮大家问了西安电子科技大学是否会从833、834、953改考为408&#xff1f; 西电老师回复&#xff1a;根据上级文件要求&#xff0c;招生简章以及专业目录会在网上报名开始前公布&#xff0c;专业课不会又大变动&#xff01; 因为大家安心复习即可&#xff0c;保证今…

C++编程基础:内联函数、auto关键字、基于范围的for循环和nullptr

内联函数 概念 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。 如果在函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。 特性 1.我们可以这…

肌筋膜炎可以自愈吗

肌筋膜炎是一种临床常见的疾病&#xff0c;主要表现为肌肉的筋膜发生无菌性炎症&#xff0c;可能由多种因素诱发&#xff0c;如风寒侵袭、疲劳、外伤、不良生活习惯及工作姿势等。关于肌筋膜炎是否可以自愈&#xff0c;主要取决于病情的严重程度和个体差异。 一、肌筋膜炎的自…