BFS 算法专题(三):BFS 解决边权为 1 的最短路问题

目录

1. 迷宫中离入口最近的出口 

1.1 算法原理

1.2 算法代码

2. 最小基因变化 ★★★

2.1 算法原理

2.2 算法代码

3. 单词接龙

3.1 算法原理

3.2 算法代码

4. 为高尔夫比赛砍树 (hard)

4.1 算法原理

 4.2 算法代码


1. 迷宫中离入口最近的出口 

. - 力扣(LeetCode)

1.1 算法原理

核心问题: 图论 => 边权为1/边权相同 的最短路径问题

解法: 从起点开始, 进行 BFS 扩展, 第一次到达终点时, 扩展的层数, 就是最短的路径.

如何记录 BFS 扩展的层数呢??
--- 借助每一层中节点的数量(queue.size()), 使用变量 ret 记录扩展的层数.

1.2 算法代码

class Solution {public int nearestExit(char[][] maze, int[] entrance) {int[] dx = { 1, -1, 0, 0 };int[] dy = { 0, 0, 1, -1 };// 记录到达终点时, BFS 的层数int ret = 0;int m = maze.length, n = maze[0].length;boolean[][] check = new boolean[m][n];Queue<int[]> q = new LinkedList<>();q.offer(entrance);check[entrance[0]][entrance[1]] = true;while (!q.isEmpty()) {int size = q.size();ret++;while (size-- != 0) {int[] tmp = q.poll();int a = tmp[0], b = tmp[1];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 && !check[x][y] && maze[x][y] == '.') {if (x == 0 || x == m - 1 || y == 0 || y == n - 1) return ret;q.offer(new int[] { x, y });check[x][y] = true;}}}}return -1;}
}

2. 最小基因变化 ★★★

. - 力扣(LeetCode)

2.1 算法原理

问题转化: 转化为 => 图论 边权为1的最短路问题

  1. 每变一个字符(基因的变化)看做一步, BFS 选出达到目标基因序列时的最短路.
  2. 注意: 不能重复搜索已经搜索过的状态
  3. 注意: 经过变化的字符串, 应该在 bank 基因库中存在
  4. 使用 哈希表 标记已经搜索过的状态
  5. 使用 哈希表 保存基因库中的字符(便于查找变化的字符串是否在基因库中)

2.2 算法代码

class Solution {public int minMutation(String startGene, String endGene, String[] bank) {Queue<String> q = new LinkedList<>();// 判断是否重复转化Set<String> check = new HashSet<>();// 判断基因库中是否存在Set<String> hash = new HashSet<>();for(String s : bank) hash.add(s);if(!hash.contains(endGene)) return -1;if(startGene.equals(endGene)) return 0;char[] change = {'A', 'C', 'G', 'T'};int ret = 0;q.offer(startGene);check.add(startGene);while(!q.isEmpty()) {int size = q.size();ret++;while(size-- != 0) {String s = q.poll();for(int i = 0; i < 8; i++) {char[] tmp = s.toCharArray();for(int j = 0; j < 4; j++) {tmp[i] = change[j];String next = new String(tmp);if(hash.contains(next) && !check.contains(next)) {if(next.equals(endGene)) return ret;check.add(next);q.offer(next);}}}}}return -1;}
}

3. 单词接龙

. - 力扣(LeetCode)

3.1 算法原理

  • 本题解法与上题解法完全一致.

  • 只不过返回值略有差异. 本题返回达到目标字符串时, 所涉及到的最少的字符串的个数(最短路 +1)

3.2 算法代码

class Solution {public int ladderLength(String beginWord, String endWord, List<String> wordList) {// 把字典中的字符串, 放到哈希表中 => 查找效率 O(1)Set<String> hash = new HashSet<>(wordList);if(!hash.contains(endWord)) return 0;int n = beginWord.length();// 判断是否重复转化Set<String> check = new HashSet<>();Queue<String> q = new LinkedList<>();int step = 0;q.offer(beginWord);check.add(beginWord);while(!q.isEmpty()) {int size = q.size();step++;while(size-- != 0) {String s = q.poll();for(int i = 0; i < n; i++) {char[] tmp = s.toCharArray();for(char ch = 'a'; ch <= 'z'; ch++) {tmp[i] = ch;String next = new String(tmp);if(hash.contains(next) && !check.contains(next)) {if(next.equals(endWord)) return step + 1;q.offer(next);check.add(next);}}}}}return 0;}
}

4. 为高尔夫比赛砍树 (hard)

. - 力扣(LeetCode)

4.1 算法原理

  • 对砍树的顺序做好记录(所砍树的高度应从小到大), 并记录好每一颗树的位置.

  • 从起点开始, 对这些位置依次进行 BFS, 找出到达这些位置的最短路.

  • 返回到达所有位置所需最少步数之和

 4.2 算法代码

class Solution {int m, n;int[] dx = new int[] { 1, -1, 0, 0 };int[] dy = new int[] { 0, 0, 1, -1 };public int cutOffTree(List<List<Integer>> forest) {m = forest.size(); n = forest.get(0).size();List<int[]> trees = new ArrayList<>();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (forest.get(i).get(j) > 1) trees.add(new int[] {i, j});}}// 依次需要砍的树(树的高度从小到大)Collections.sort(trees, (a, b) -> forest.get(a[0]).get(a[1]) - forest.get(b[0]).get(b[1]));int step = 0;int curX = 0, curY = 0;for (int[] t : trees) {int x = t[0], y = t[1];int ret = bfs(x, y, curX, curY, forest);if (ret == -1) return -1;step += ret;curX = x;curY = y;}return step;}public int bfs(int x, int y, int curX, int curY, List<List<Integer>> forest) {int ret = 0;if (curX == x && curY == y) return 0;boolean[][] check = new boolean[m][n];Queue<int[]> q = new LinkedList<>();q.offer(new int[] { curX, curY });check[curX][curY] = true;while (!q.isEmpty()) {int size = q.size();ret++;while (size-- != 0) {int[] t = q.poll();int a = t[0], b = t[1];for (int k = 0; k < 4; k++) {int i = a + dx[k], j = b + dy[k];if (i >= 0 && i < m && j >= 0 && j < n && forest.get(i).get(j) != 0 && !check[i][j]) {if (forest.get(i).get(j) == forest.get(x).get(y))return ret;q.offer(new int[] { i, j });check[i][j] = true;}}}}return -1;}
}

END

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

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

相关文章

「数据要素」行业简报|2024.11.上刊

纵观数据要素行业动态&#xff0c;洞察行业风向&#xff0c;把握行业脉搏&#xff01; 一、政策发布 1、《山东省公共数据资源登记管理工作规范(试行)》公开征求意见 11月7日&#xff0c;为认真贯彻落实《中共中央办公厅 国务院办公厅关于加快公共数据资源开发利用的意见》《…

有什么好用的 WebSocket 调试工具吗?

在开发和测试 WebSocket 应用程序时&#xff0c;确保客户端能够正确地与服务器建立连接、发送和接收消息是非常重要的。 市面上有许多通用的 API 测试工具&#xff0c;它们大多专注于 HTTP 请求&#xff0c;而对于 WebSocket 的支持则显得较为有限。这种局限性使得开发者在寻找…

MQTT协议解析 : 物联网领域的最佳选择

1. MQTT协议概述 1.1 MQTT协议是什么 MQTT : Message Queuing Telemetry Transport 模式 : 发布 / 订阅主题优点 : 代码量小、低带宽、实时可靠应用 : 物联网、小型设备、移动应用MQTT 常用端口 : 1883 MQTT是一个网络协议&#xff0c;和HTTP类似&#xff0c;因为轻量简单&…

鸿蒙HarmonyOS 网络请求获取数据Http

注意的是;要为接口返回值指定类型 &#xff0c;以及定义接口数据类型 index.ets import { http } from kit.NetworkKit;interface createAtType {date: number,}interface dataListType {createAt: createAtType;imgUrl: }Component export default struct TabBar {State dat…

2024136读书笔记|《飞鸟集》——使生如夏花之绚烂,死如秋叶之静美

2024136读书笔记|《飞鸟集》——使生如夏花之绚烂&#xff0c;死如秋叶之静美 《飞鸟集》[印]泰戈尔&#xff0c;一本有意思的诗集&#xff0c;中英文对照着读更有意思。“你是谁&#xff0c;读者&#xff0c;百年后读着我的诗&#xff1f;”让我觉得有些久别重逢&#xff0c;忽…

ROS Action

在 ROS 中&#xff0c;Action 是一种支持长时间异步任务的通信机制。与 Service 不同&#xff0c;Action 允许客户端发起一个请求&#xff0c;并在任务执行的过程中不断接收反馈&#xff0c;直到任务完成。这种机制非常适用于可能需要较长时间来完成的任务&#xff0c;比如机器…

约束(MYSQL)

not null&#xff08;非空&#xff09; unique&#xff08;唯一&#xff09; default&#xff08;默认约束&#xff0c;规定值&#xff09; 主键约束primary key&#xff08;非空且唯一&#xff09; auto_increment&#xff08;自增类型&#xff09; 复合主键 check&#xff08…

笔记 | image may have poor performance,or fail,if run via emulation

在Docker Desktop中现象如图&#xff1a; 当你运行 AMD64 平台代码时&#xff08;Intel 和 AMD 芯&#xff09;&#xff0c;你的 Mac 必须模拟其CPU架构&#xff08;因为你自身是ARM&#xff09;。这通常会非常吃性能。 Docker Desktop 警告你在模拟 Intel/AMD x64 CPU 时性能可…

【C++】C++11特性(上)

✨✨欢迎大家来到Celia的博客✨✨ &#x1f389;&#x1f389;创作不易&#xff0c;请点赞关注&#xff0c;多多支持哦&#x1f389;&#x1f389; 所属专栏&#xff1a;C 个人主页&#xff1a;Celias blog~ 目录 一、列表初始化 二、std::initializer_list 三、右值引用和移…

24/11/7 算法笔记 PCA主成分分析

假如我们的数据集是n维的&#xff0c;共有m个数据(x,x,...,x)。我们希望将这m个数据的维度从n维降到k维&#xff0c;希望这m个k维的数据集尽可能的代表原始数据集。我们知道数据从n维降到k维肯定会有损失&#xff0c;但是我们希望损失尽可能的小。那么如何让这k维的数据尽可能表…

JS 实现SSE通讯和了解SSE通讯

SSE 介绍&#xff1a; Server-Sent Events&#xff08;SSE&#xff09;是一种用于实现服务器向客户端实时推送数据的Web技术。与传统的轮询和长轮询相比&#xff0c;SSE提供了更高效和实时的数据推送机制。 SSE基于HTTP协议&#xff0c;允许服务器将数据以事件流&#xff08;…

C/C++每日一练:查找链表的中间节点

链表&#xff08;Linked List&#xff09; 链表是一种线性数据结构&#xff0c;由一系列节点&#xff08;Node&#xff09;通过指针链接在一起。与数组不同&#xff0c;链表中的元素在内存中不需要连续存储&#xff0c;每个节点包含两部分&#xff1a; 数据部分&#xff1a;存…

对称加密与非对称加密:密码学的基石及 RSA 算法详解

对称加密与非对称加密&#xff1a;密码学的基石及 RSA 算法详解 在当今数字化的时代&#xff0c;信息安全至关重要。对称加密和非对称加密作为密码学中的两种基本加密技术&#xff0c;为我们的数据安全提供了强大的保障。本文将深入探讨对称加密和非对称加密的特点、应用场景&…

PH47代码框架全局函数及功能类

PH47代码框架全局函数及功能类 概述 全局函数及功能类体系是PH47框架当中除了4个逻辑层之外最重要的组成部分之一&#xff0c;它们可以在 整个PH7 代码框架及用户代码中使用。常用全局函数及功能类为 PH7 代码框架提供了最常用和最基础的功能实现。 全局函数主要包含了对时间…

力扣 LeetCode 203. 移除链表元素(Day2:链表)

解题思路&#xff1a; 方法一&#xff1a;头节点和非头节点分开处理 方法二&#xff1a;定义一个dummy虚拟节点&#xff0c;后面的节点就可以采用相同的处理方式 注意&#xff1a; cur需要指向要删除的节点的上一个节点&#xff0c;因为要越过这一个被删除的节点 class Sol…

IEC60870-5-104 协议源码架构详细分析

IEC60870-5-104 协议源码架构 前言一、资源三、目录层级一二、目录层级二config/lib60870_config.hdependencies/READMEexamplesCMakeLists.txtcs101_master_balancedcs104_client_asyncmulti_client_servertls_clienttls_server说明 make这些文件的作用是否需要导入这些文件&a…

turbo c 2.0 画螺栓

代码; #include<graphics.h> void bolt(x0,y0,d,l) int x0,y0,d,l; {int x1,x2,x3,x4,x5,x6,x7,x8;int y1,y2,y3,y4,y5,r1,r2,b,c;if(l>2*d) b2*d;else b1;r11.5*d;r20.38*d;c0.1*d;x1x0-0.7*d;x2x0-0.61*d;x3x0-0.32*d;x4x00.8*d;x5x0l-b;x6x0l-c;x7x0l-0.05*d;x8x0…

网络服务综合项目-博客

一、运行环境&#xff1a; 主机主机名系统服务192.168.31.128Server-WebLinuxWeb192.168.31.129Server-NFS-DNSLinuxNFS 二、基础配置&#xff1a; 配置主机名开启防火墙并配置部分开启selinux并配置服务器之间使用ntp.aliyun.com进行时间同步服务器之间实现ssh免密登录 三…

leetcode86:分隔链表

给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2], x 3 输出&am…

Android Mobile Network Settings | APN 菜单加载异常

问题 从log看是有创建APN对应的Controller&#xff08;功能逻辑是ok的&#xff09;&#xff0c;但是Mobile Network Settings无法显示&#xff08;UI异常&#xff09;。 日志分析 看似APN 菜单已经创建了&#xff0c;实际上并没有显示。 11-12 07:01:28.150 8773 8773 D Pr…