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

news2024/12/23 15:51:45

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;
            }
            //如果最终的字符串不存在基因库中就返回-1
            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;
        }
    }

 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.coloradmin.cn/o/2136303.html

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

相关文章

安泰高压放大器在基于EHD电喷的柔性压力传感器制备研究中的应用

实验名称&#xff1a;基于EHD电喷的柔性压力传感器制备技术研究 研究方向&#xff1a;EHD电喷技术是近年来出现的一种微纳尺度的新型3D打印技术&#xff0c;因其打印精度高、设备操作简单、材料来源广泛以及成本低等特点受到广泛关注&#xff0c;在柔性电子、生物医疗和可穿戴设…

C++ 继承【一篇让你学会继承】

1. 继承的概念及定义 1.1 继承的概念 继承机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特征的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象程序设计的层次结构&…

基于JavaWeb开发的java springboot+mybatis电影售票网站管理系统前台+后台设计和实现

基于JavaWeb开发的java springbootmybatis电影售票网站管理系统前台后台设计和实现 &#x1f345; 作者主页 网顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获…

【Linux实践】实验二:LINUX操作基础

【Linux实践】实验二&#xff1a;LINUX操作基础 实验目的实验内容实验步骤及结果1. 打开终端2. 关闭计算机命令3. 查看帮助文档4. 修改计算机主机名5. 显示月历和时间6. 统计行数、字符数、单词数 这章开始要涉及到命令了&#xff0c;其他关于命令的内容可以看我 2021年写的笔记…

量水堰计的校准与维护:确保测量结果的准确性

量水堰计作为水利工程中用于测量和调节水流量的重要设备&#xff0c;其准确性和可靠性直接关系到水利设施的正常运行及数据收集的精度。因此&#xff0c;定期校准与维护量水堰计是确保测量结果准确性的关键步骤。本文将从量水堰计的校准方法和周期&#xff0c;以及日常维护保养…

wifi贴码推广能赚钱吗?wifi贴码怎么跟商家沟通?

大家好&#xff0c;我是鲸天科技千千&#xff0c;大家都知道我是做开发的&#xff0c;平时会给大家分享一些互联网相关的创业项目和网络技巧&#xff0c;感兴趣的可以给我点个关注。 最近WiFi这个项目很多朋友来问我&#xff0c;我是前两年就接触过这个&#xff0c;所以比较了…

望繁信科技携流程智能解决方案亮相CNDS 2024新能源产业数智峰会

9月13日&#xff0c;CNDS 2024中国新能源产业数智峰会在北京圆满落幕。本次峰会以“走向数字新能源”为主题&#xff0c;汇聚了来自新能源领域的顶尖领袖、专家学者及知名企业代表&#xff0c;共同探讨数字化技术在新能源行业中的创新应用和发展趋势。上海望繁信科技有限公司&a…

中秋出游热度十足!喆啡酒店如何巧妙捕捉多元旅游需求?

中秋假期临近&#xff0c;多家旅游OTA平台陆续发布旅游热度预测&#xff0c;皆认为中秋小长假有望延续暑期旅游热度。马蜂窝大数据显示&#xff0c;“中秋去哪”关键词近一周热度环比上涨110%&#xff0c;且“中秋3日游”关键词的热度更是大涨175%。消费趋势方面&#xff0c;受…

CAT1 DTU软硬件设计开源资料分析(TCP协议+GNSS定位版本 )

一、CAT1 DTU方案简介&#xff1a; 远程终端单元DTU&#xff0c;一种针对通信距离较长和工业现场环境恶劣而设计的具有模块化结构的、特殊的计算机测控单元&#xff0c;它将末端检测仪表和执行机构与远程控制中心相连接。 奇迹TCP DTUGNSS版本DTU&#xff0c;用于将远程现场的…

【面试干货】软件测试面试题汇总

我把软件测试面试的整个题库都搬来啦&#xff0c;面试能拿下80%&#xff0c;剩下就看你满不满意公司的开价咯。以下答案都是我自己写的&#xff0c;大家根据自己的经历稍作改动&#xff0c;答案仅供参考哦&#xff01;题库持续更新&#xff0c;需要PDF版可以点击文末小卡片领取…

Unity3d 以鼠标位置点为中心缩放视角(正交模式下)

思路整理&#xff1a; 缩放前&#xff1a; 缩放后&#xff1a; 记录缩放前鼠标的屏幕坐标 A&#xff0c;计算鼠标位置对应的世界坐标 A_world 缩放完成后&#xff0c;根据当前屏幕下A所对应的世界坐标A1_world 计算A1_world 和 A_world 的偏移量 移动摄像机 代码&#xff…

将5s1的搜索难度曲线二次归一化

在行列可自由变换的平面上&#xff0c;5点结构只有34个 (A,B)---6*30*2---(0,1)(1,0) 分类A和B&#xff0c;让A是34个5点结构&#xff0c;让B全是0。收敛误差为7e-4&#xff0c;收敛199次取迭代次数平均值&#xff0c; 让训练集A-B矩阵的高分别是5&#xff0c;6.当高为5的时候…

陪护小程序|陪护小程序成品|陪护小程序源码

陪护系统是为提供病人及其家属更好的服务而开发的一种软件系统。在开发陪护系统时&#xff0c;有一些注意事项是需要考虑的。 首先&#xff0c;需要明确陪护系统的主要功能和目标群体。陪护系统可以包括病人信息管理、医护人员协作、医药管理、预约挂号等功能。我们需要确定开发…

项目管理 | 一文读懂什么是敏捷开发管理

在快速变化的商业环境中&#xff0c;项目管理方式也在不断演进&#xff0c;其中敏捷开发管理因其高效、灵活和适应性强的特点&#xff0c;逐渐成为众多企业和团队的首选。本文将详细解析敏捷开发管理的定义、具体内容及其核心角色&#xff0c;帮助读者全面理解这一先进的项目管…

Python基础语法(3)上

函数 函数是什么 编程中的函数和数学中的函数有一定的相似之处. 数学上的函数&#xff0c;比如 y sin x&#xff0c;x 取不同的值&#xff0c;y 就会得到不同的结果 编程中的函数是一段可以被重复使用的代码片段 代码示例&#xff1a;求数列的和&#xff0c;不使用函数 …

教育培训小程序开发,简单实用的入门指南

教育培训小程序可以帮助教育机构和个人老师提供更灵活的在线教学服务&#xff0c;满足学生的学习需求。对于初学者来说&#xff0c;开发一个功能齐全的教育培训小程序并不复杂&#xff0c;只需掌握一些基础的开发知识和工具即可。本文将带你了解如何使用微信小程序开发工具&…

如何准备技术面试?

大家好&#xff0c;我是老三&#xff0c;好久没更新了&#xff0c;翻出之前的一篇旧稿&#xff0c;是一篇总纲性质的文章——如何准备一场技术面试。这篇文章原本的开头是写给金三银四的&#xff0c;转眼就“金九银十”了&#xff0c;每一年都是最差的一年&#xff0c;又是未来…

跨平台开发新视角:利用Android WebView实现Web内容的原生体验

在移动应用开发领域&#xff0c;跨平台解决方案一直是一个热门话题。开发者们不断寻求能够同时在iOS和Android平台上提供一致用户体验的方法。而Android的WebView组件&#xff0c;作为一个强大的工具&#xff0c;允许开发者在Android应用中嵌入Web内容&#xff0c;为用户提供接…

Python(三)-流程控制

目录 Python三大基本语句 if语句 if-else语句 if..elif...else... if嵌套语句 for循环 while循环 死循环 while嵌套 break语句 continue语句 案例-猜拳游戏 Python三大基本语句 &#xff08;1&#xff09;顺序语句 &#xff08;2&#xff09;分支语句 &#xff…

P3489 [POI2009] WIE-Hexer

*原题链接* 最短路状态压缩 不愧是POI的题&#xff0c;看题面知道要求加了一些限制的最短路&#xff0c;看数据范围很容易想到状态压缩。 求解最短路就用堆优化dijkstra好了。 至于状态压缩&#xff0c;我们对原数组再开一维&#xff0c;表示此时“剑的集合”&#xff0c;相…