【BFS专题】— 解决最短路问题

1、迷宫中离入口最近的出口 - 力扣(LeetCode)

思路:

  1. 利用BFS层序遍历,新建一个变量统计步数
  2. 代码:
    class Solution {int dx[] = {0, 0, -1, 1};int dy[] = {1, -1, 0, 0};public int nearestExit(char[][] maze, int[] entrance) {int m = maze.length;int n = maze[0].length;boolean[][] vis = new boolean[m][n];Queue<int[]> q = new LinkedList<>();q.offer(new int[]{entrance[0], entrance[1]});vis[entrance[0]][entrance[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];int b = t[1];for(int j = 0; j < 4; j++){int x = a + dx[j];int 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;}q.add(new int[]{x,y});vis[x][y] = true;}}}}return -1;}
    }

 2、最小基因变化 - 力扣(LeetCode)

思路:

  1. 用哈希表来标记搜索过的状态
  2. 遍历原字符串每一位,改成ACGT,再判断是否合法和是否已经出现过
  3. 利用哈希表判断是否在基因库中
  4. 代码:
    class Solution {public int minMutation(String startGene, String endGene, String[] bank) {//用来标记已经搜索过的状态Set<String> vis = new HashSet<>();//用来统计基因库中的字符串便于判断Set<String> hash = new HashSet<>();for(String x : bank){hash.add(x);}char[] change = {'A', 'C', 'G', 'T'};//如果初识和最终相等就直接返回if(startGene.equals(endGene)){return 0;}//如果最终的字符串不存在基因库中就返回-1if(!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;}
    }

 3、单词接龙 - 力扣(LeetCode)

思路:

  1. 与上一题的思路一样,这道题的范围是‘a’ ~ ‘z’
  2. 返回的长度就是在步数加一
  3. 代码:
    class Solution {public int ladderLength(String beginWord, String endWord, List<String> wordList) {Set<String> vis = new HashSet<>();Set<String> hash = new HashSet<>();for(String x : wordList){hash.add(x);}if(beginWord.equals(endWord)){return 0;}if(!hash.contains(endWord)){return 0;}Queue<String> q = new LinkedList<>();q.offer(beginWord);vis.add(beginWord);int len = 0;while(!q.isEmpty()){len++;int sz = q.size();while(sz-- != 0){String t = q.poll();for(int i = 0; i < beginWord.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(endWord.equals(next)){return len+1;}q.offer(next);vis.add(next);}}}}}return 0;}
    }

 4、为高尔夫比赛砍树 - 力扣(LeetCode)

思路:

  1. 按照树的由低到高来砍树,可以转换成数字低到高的最短路径之和
  2. 先将所以值排序,按照从小到大的最短路径遍历
  3. 代码:
    class Solution {int m, n;public int cutOffTree(List<List<Integer>> f) {m = f.size();n = f.get(0).size();//1、准备工作确定砍树的顺序List<int[]> trees = new ArrayList<>();for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){if(f.get(i).get(j) > 1){trees.add(new int[]{i, j});}}}//排序Collections.sort(trees, (a,b) ->{return f.get(a[0]).get(a[1]) - f.get(b[0]).get(b[1]);});//2、按照顺序砍树int ret = 0;int bx = 0, by = 0;for(int[] tree : trees){int x = tree[0];int y = tree[1];int step = bfs(f, bx, by, x, y);if(step == -1){return -1;}ret += step;bx = x;by = y;}return ret;}int[] dx = {0, 0, -1, 1};int[] dy = {-1, 1, 0, 0};public int bfs(List<List<Integer>> f, int bx, int by, int ex, int ey){if(bx == ex && by == ey){return 0;}Queue<int[]> q = new LinkedList<>();boolean[][] vis = new boolean[m][n];q.add(new int[]{bx, by});vis[bx][by] = true;int step = 0;while(!q.isEmpty()){step++;int sz = q.size();while(sz-- != 0){int[] t = q.poll();int a = t[0];int b = t[1];for(int i = 0; i < 4; i++){int x = a + dx[i];int y = b + dy[i];if(x >= 0 && x < m && y >= 0 && y < n && f.get(x).get(y) != 0 && !vis[x][y]){if(x == ex && y == ey ){return step;}q.add(new int[]{x,y});vis[x][y] = true;}}}}return -1;}
    }

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

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

相关文章

URP 线性空间 ui资源制作规范

前言&#xff1a; 关于颜色空间的介绍&#xff0c;可参阅 unity 文档 Color space URP实现了基于物理的渲染&#xff0c;为了保证光照计算的准确&#xff0c;需要使用线性空间&#xff1b; 使用线性空间会带来一个问题&#xff0c;ui资源在unity中进行透明度混合时&#xff…

Centos7 Hadoop 单机版安装教程(图文)

本章教程,主要记录如何在Centos7中安装Hadoop单机版。 一、软件安装包和基础环境 CentOS7.x,jdk8,hadoop 通过网盘分享的文件:Hadoop 链接: https://pan.baidu.com/s/1_qGI9QeXMAJNb3TydHhQGA?pwd=xnz4 提取码: xnz4 当然你也可以自己去官网下载。 java8:https://www.ora…

Redis:发布(pub)与订阅(sub)实战

前言 Redis发布订阅&#xff08;Pub/Sub&#xff09;是Redis提供的一种消息传递机制&#xff0c;它使用“发布者-订阅者”&#xff08;publisher-subscriber&#xff09;模式来处理消息传递。在这种模式下&#xff0c;发布者将消息发布到一组订阅者中&#xff0c;而无需关心谁…

java的内存分配和回收机制

Java 与 C之间有一堵由内存动态分配和垃圾收集技术所围成的高墙&#xff0c;墙外面的人想进去&#xff0c;墙里面的人却想出来。 概述 垃圾收集&#xff08;GC&#xff09;需要完成的三件事情&#xff1a; 哪些内存需要回收&#xff1f;什么时候回收&#xff1f;如何回收&am…

Linux操作系统入门(三)

_______________________________________________ 一.Linux操作系统的文件结构 相比于Windows操作系统的C,D,E等盘符&#xff0c;Linux操作系统仅有一个"/"符号的根目录. 这其中存在一个显著的不同&#xff0c;Linux操作系统使用的是斜杠"/",而Windows…

基于微信小程序的宠物之家的设计与实现

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSpringBootVueMySQL的宠物之家/宠物综合…

判断当前环境是否为docker容器下

判断当前环境是否为docker容器下 webshell后或登录到系统后台&#xff0c;判断是否为docker容器可使用如下方法&#xff1a; 方式一&#xff1a;使用ls -alh命令查看是否存在.dockerenv来判断是否在docker容器环境内 ls -alh /.dockerenv如下图无.dockerenv文件&#xff0c;所…

本地部署轻量级web开发框架Flask结合内网穿透公网环境访问管理界面

文章目录 1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 本篇文章主要讲解如何在本地安装Flask&#xff0c;以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架&#xff0c;采用Python编程语…

无人机飞手教员组装、调试高级教学详解

随着无人机技术的飞速发展&#xff0c;其在航拍、农业、救援、监测等多个领域的应用日益广泛&#xff0c;对专业无人机飞手的需求也随之增加。作为无人机飞手教员&#xff0c;掌握无人机的高级组装、调试技能不仅是教学的基础&#xff0c;更是培养学生成为行业精英的关键。本教…

【吊打面试官系列-Redis面试题】使用过 Redis 做异步队列么,你是怎么用的?

大家好&#xff0c;我是锋哥。今天分享关于【使用过 Redis 做异步队列么&#xff0c;你是怎么用的&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 使用过 Redis 做异步队列么&#xff0c;你是怎么用的&#xff1f; 一般使用 list 结构作为队列&#xff0c;rpus…

Word中插入当前日期与时间

Word中插入当前日期与时间 通过构建基块的方法快速插入当前日期与时间 快捷键操作 快捷键具体功能说明 Alt Shift D 插入当前日期date Alt Shift T 插如当前时间time Ctrl Shift F9 使得域文本变为正常文本 Ctrl F11 锁定域更新域菜单工具会变为黑色 C…

你的大模型应用表现真的好吗?借助 Dify + Langfuse 一探究竟

背景介绍 众所周知&#xff0c;大模型应用的输出存在着一些不确定性&#xff0c;往往需要迭代多轮才能得到较为稳定的输出结果&#xff0c;因此开发者往往需要关注大模型应用的实际表现&#xff0c;并进行有针对性的优化。 然而常规 Web 服务的监控机制往往无法满足大模型应用…

python绘制3d建筑

import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d.art3d import Poly3DCollection# 随机生成建筑块数据 def generate_building_blocks(num_blocks, grid_size100, height_range(5, 50), base_size_range(10, 30)):buildings []for _ in range(…

sqli-labs靶场自动化利用工具——第1关

文章目录 概要整体架构流程技术细节执行效果小结 概要 Sqli-Labs靶场对于网安专业的学生或正在学习网安的朋友来说并不陌生&#xff0c;或者说已经很熟悉。那有没有朋友想过自己开发一个测试脚本能实现自动化化测试sqli-labs呢&#xff1f;可能有些人会说不是有sqlmap&#xf…

中国矿业大学《2023年868+2007年自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《25届中国矿业大学868自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2007年复试真题 2023年初试真题 Part1&#xff1a;完整版真题 2007年复试真题 2…

【Python基础】Python错误和异常处理(详细实例)

本文收录于 《Python编程入门》专栏&#xff0c;从零基础开始&#xff0c;分享一些Python编程基础知识&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、Python中的错误类型三、Python异常处理机制3.1 try-except语句3.2 try-except-else语句3.3 try-fi…

TiDB 扩容过程中 PD 生成调度的原理及常见问题丨TiDB 扩缩容指南(一)

导读 作为一个分布式数据库&#xff0c;扩缩容是 TiDB 集群最常见的运维操作之一。本系列文章&#xff0c;我们将基于 v7.5.0 具体介绍扩缩容操作的具体原理、相关配置及常见问题的排查。 通常&#xff0c;我们根据当前资源状态来决定是否需要调整 TiKV 节点的规模&#xff0…

探索螺钉设计:部分螺纹与全螺纹,哪种更适合你的项目?

为什么有些螺钉有部分螺纹? 螺钉由头部、柄部和尖端组成&#xff0c;是世界上zui常用的紧固件之一。与螺栓一样&#xff0c;它们旨在将多个对象或表面连接在一起。但是&#xff0c;在比较不同类型的螺钉时&#xff0c;您可能会注意到其中一些都具有部分螺纹杆。 什么是螺柄&a…

Python | Leetcode Python题解之第397题整数替换

题目&#xff1a; 题解&#xff1a; class Solution:def integerReplacement(self, n: int) -> int:ans 0while n ! 1:if n % 2 0:ans 1n // 2elif n % 4 1:ans 2n // 2else:if n 3:ans 2n 1else:ans 2n n // 2 1return ans

Python_两个jpg图片文件名称互换

项目场景 处理Adobe Photoshop导出的两个切片的顺序错误问题 小编在进行图片切片处理的时候&#xff0c;发现用PS导出的切片顺序错误&#xff0c;例如用PS导出的切片分别为test_01.jpg&#xff0c;test_02.jpg&#xff0c;但实际的使用需求是将两个图片的顺序调换&#xff0c…