BFS解决单源最短路问题

目录

迷宫中离入口最近的出口

最小基因变化

单词接龙

为高尔夫比赛砍树


迷宫中离入口最近的出口

题目

思路

使用宽度优先遍历解决这道题,需要一个二维数组标记是否被遍历过,也需要一个队列辅助完成宽度优先遍历,类似于水波纹一样,一层一层的往外扩,如果扩到了矩阵边缘行,则返回步数,就是离入口最近的距离。

代码

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

public:
    int nearestExit(vector<vector<char>>& maze, vector<int>& entrance) {
        int m=maze.size(),n=maze[0].size();
        vector<vector<bool>> vis(m,vector<bool>(n,false));
        queue<pair<int,int>> q;
        int step=0;
        q.push({entrance[0],entrance[1]});
        vis[entrance[0]][entrance[1]]=true;
        while(!q.empty()){
            int sz=q.size();
            step++;
            for(int i=0;i<sz;i++){
                int a=q.front().first;
                int b=q.front().second;
                q.pop();
                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 && !vis[x][y] && maze[x][y]=='.'){
                        if(x==0 || x==m-1 || y==0 || y==n-1)
                            return step;
                        q.push({x,y});
                        vis[x][y]=true;
                    }
                }
            }
        }
        return -1;
    }
};
最小基因变化

题目

思路

其实仔细分析这道题后可以发现,也可以用宽度优先遍历来解决这道题,每一次某位置变化一个字母,就相当于以某位置为起点往外扩了一层,为了便于快速地判断变换后的基因序列是否在基因库中,将基因库中的基因序列存储到哈希表中,同时也需要一个哈希表来标记某些基因序列是否已经变换过,另外也需要一个队列来完成宽度优先遍历的辅助操作。

需要注意的是,在对基因序列的某位置变换前,需保存一下变换前的基因序列,便于变换后再进行恢复还原。

代码

class Solution {
public:
    int minMutation(string startGene, string endGene, vector<string>& bank) {
        unordered_set<string> vis;
        unordered_set<string> hash(bank.begin(),bank.end());
        string s="ACGT";
        if(startGene==endGene) return 0;
        if(!hash.count(endGene)) return -1;
        queue<string> q;
        q.push(startGene);
        vis.insert(startGene);
        int ret=0;
        while(!q.empty()){
            int sz=q.size();
            ret++;
            for(int k=0;k<sz;k++){
                string top=q.front();
                q.pop();
                for(int i=0;i<8;i++){
                    string str=top;
                    for(int j=0;j<4;j++){
                        top[i]=s[j];
                        if(top==endGene) return ret;
                        if(!vis.count(top) && hash.count(top))
                            q.push(top),vis.insert(top);
                    }
                    top=str;
                }
            }
        }
        return -1;
    }
};
单词接龙

题目

思路

其实这道题和前一道题是类似的,只不过这道题的单词变化范围不再是'A','C','G','T',而是26个英文小写字母,为了快速判断单词是否是字典中的单词,首先将字典中的单词存放到哈希表中,同时也需要一个哈希表标记已经访问过的单词和一个队列来完成宽度优先遍历的辅助操作。

这道题同上一道题一样,进行单词的某位置前需要先保存原始单词,以便变换完单词某位置后进行恢复和还原。

代码

class Solution {
public:
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
        unordered_set<string> vis;
        unordered_set<string> hash(wordList.begin(),wordList.end());
        if(!hash.count(endWord)) return 0;
        queue<string> q;
        q.push(beginWord);
        vis.insert(beginWord);
        int ret=1;
        while(!q.empty()){
            int sz=q.size();
            ret++;
            for(int i=0;i<sz;i++){
                string top=q.front();
                q.pop();
                for(int j=0;j<beginWord.size();j++){
                    string str=top;
                    for(char ch='a';ch<='z';ch++){
                        top[j]=ch;
                        if(top==endWord) return ret;
                        if(!vis.count(top) && hash.count(top))
                            q.push(top),vis.insert(top);
                    }
                    top=str;
                }
            }
        }
        return 0;
    }
};
为高尔夫比赛砍树

题目

思路

解决这道题也是使用宽度优先遍历来解决,但是题目要求按高度从低到高砍完所有的树,因此需要对砍树的顺序进行排序,然后求出被砍顺序挨着的两个树的最短距离,分别求出这样的被砍顺序挨着的两个树的最短距离,然后加起来,就是按高度从低到高砍完所有树的最短步数,如果某一步不能正常进行,说明无法完成砍树,直接返回-1.

代码

class Solution {
    int m,n;
    int dx[4]={1,-1,0,0};
    int dy[4]={0,0,1,-1};

public:
    int cutOffTree(vector<vector<int>>& forest) {
        m=forest.size(),n=forest[0].size();
        vector<pair<int,int>> order;
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
                if(forest[i][j]>1)
                    order.push_back({i,j});
        sort(order.begin(),order.end(),[&](const pair<int,int>& p1,const pair<int,int>& p2){
            return forest[p1.first][p1.second]<forest[p2.first][p2.second];
        });
        int bx=0,by=0;
        int ret=0;
        for(auto& [a,b]:order){
            int step=bfs(forest,bx,by,a,b);
            if(step==-1) return -1;
            ret+=step;
            bx=a,by=b;
        }
        return ret;
    }

    int bfs(vector<vector<int>>& forest,int bx,int by,int ex,int ey){
        if(bx==ex && by==ey) return 0;
        queue<pair<int,int>> q;
        bool vis[51][51];
        memset(vis,false,sizeof vis);
        q.push({bx,by});
        vis[bx][by]=true;
        int step=0;
        while(!q.empty()){
            int sz=q.size();
            step++;
            for(int i=0;i<sz;i++){
                auto [a,b]=q.front();
                q.pop();
                for(int j=0;j<4;j++){
                    int x=a+dx[j],y=b+dy[j];
                    if(x==ex && y==ey) return step;
                    if(x>=0 && x<m && y>=0 && y<n && forest[x][y] && !vis[x][y])
                        q.push({x,y}),vis[x][y]=true;
                }
            }
        }
        return -1;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java接口 controller层接收list集合传参,postman 调用接口时required parameter XXX is not present

开发过程中开发一个java接口 controller层接收list集合传参&#xff0c;然后postman调用一直不成功&#xff0c;报错 使用RequestParam方式&#xff0c;如果postman 调用接口时报错required parameter XXX is not present 可能是&#xff08;value“items”&#xff09;跟你输…

线索获取:多渠道获客策略解析

在当今商业环境中&#xff0c;企业面临着激烈的市场竞争和不断变化的客户需求。在此背景下&#xff0c;销售线索作为销售活动的基础和起点&#xff0c;重要性更加凸显&#xff0c;尤其是在营销精耕的当下&#xff0c;做好线索的精细化管理成为企业获取竞争优势的关键环节之一。…

数据结构----队列

1 什么是队列&#xff1f; 只允许在两端进行插入和删除操作的线性表&#xff0c;在队尾插入&#xff0c;在队头删除 插入的一端&#xff0c;被称为"队尾"&#xff0c;删除的一端被称为"队头" 在队列操作过程中&#xff0c;为了提高效率&#xff0…

《重生到现代之从零开始的C语言生活》—— 指针3

数组名的理解 在我们使用&arr[0]的方式拿到了数组第一个元素的地址&#xff0c;但是其实&#xff0c;数组名本来就地址&#xff0c;而且是数组首元素的地址 所以数组名就是数组首元素的地址 但是会有两个例外 sizeof(数组名)&#xff0c;sizeof中单独放数组名&#xff0c…

[Linux] 查看系统资源 (持续更新中)

概述 在Linux中&#xff0c;有许多命令和工具可用于查看系统的资源使用情况。以下是一些常用的方式&#xff1a; top&#xff1a;top命令是最常见的实时系统监视工具之一。它显示了当前运行的进程列表&#xff0c;以及每个进程的CPU、内存使用情况、nice值等信息。top命令还会…

帆软报表,达梦数据库驱动上传失败

1、按照正常操作新建数据库连接&#xff0c;上传准备好的达梦驱动时&#xff0c;提示如图一需要修改SystemConfig.driverUpload为true才可以。 2、FineDB存储了数据决策系统中除平台属性配置以外的所有信息。详情请参见&#xff1a; FineDB 数据库简介。 3、因此管理员可通过…

Kubectl基础命令使用

一.Kubectl 基础命令 格式&#xff1a; kubectl [command] [TYPE] [NAME] [FLAGS] kubectl 是 Kubernetes 的命令行工具&#xff0c;用于管理 Kubernetes 集群。以下是一些常用的 kubectl 命令及其选项&#xff1a; 常用命令 获取资源 列出所有资源类型&#xff08;Pods、De…

机器学习|什么是梯度下降(小白向)|探寻最优解之路

文章目录 前言一、什么是梯度下降&#xff1f;二、梯度下降法一般步骤1.确定一个小目标——预测函数2.找到差距——代价函数3.明确搜索方向——梯度计算4.一步要走多远&#xff1f;——学习率 三、梯度下降的分类批量梯度下降&#xff08;Batch Gradient Descent&#xff09;随…

2007-2022年上市公司资源节约数据

2007-2022年上市公司资源节约数据 1、时间&#xff1a;2007-2022年 2、来源&#xff1a;上市公司年报、社会责任报告、上市公司网站信息 3、指标&#xff1a;水资源节约、电力节约、原煤节约、天然气节约、汽油节约、柴油节约、集中供热节约、折算成统一标准煤共计节约 4、…

flume--数据从kafka到hdfs发生错误

解决&#xff1a; #1.将flume自带的依赖删除 mv /opt/installs/flume1.9/lib/guava-11.0.2.jar /opt/installs/flume1.9/lib/guava-11.0.2.jar.bak #2.将hadoop的依赖发送到flume下 cp /opt/installs/hadoop3.1.4/share/hadoop/common/lib/guava-27.0-jre.jar /opt/installs/f…

有哪些同声传译软件?精选5款实用工具

在浪漫之都巴黎&#xff0c;每一步都踏着历史与艺术的韵律。从埃菲尔铁塔下仰望的震撼&#xff0c;到塞纳河畔悠闲的咖啡时光&#xff0c;打卡巴黎地标已不再满足于传统方式。 如今&#xff0c;#打卡巴黎地标的方式nextlevel了#&#xff0c;科技与文化的碰撞开启了全新的体验篇…

『基础』线性代数-1行列式

行列式是什么-运算规则 排列&#xff1a;不同的 n 元排列共有 n! 个 逆序&#xff1a;小数排在大数后面&#xff0c;叫逆序&#xff1b;一个排列中逆序的总和叫做这个排列的逆序数&#xff0c;记为 τ ( j 1 , . . . , j n ) \tau(j_1,...,j_n) τ(j1​,...,jn​) 逆序数的计…

IP SSL证书的未来趋势:适应不断变化的安全挑战

随着网络攻击手段的不断进化和用户对隐私保护意识的增强&#xff0c;IP SSL证书作为保障网络安全的关键组件之一&#xff0c;也在不断地发展和完善。本文将探讨IP SSL证书的未来趋势&#xff0c;以及如何适应这些不断变化的安全挑战。 当前状况与挑战 网络安全意识提升&#…

LORA通信详解

LORA&#xff08;Long Range Radio&#xff09;是一种低功耗广域网&#xff08;LPWAN&#xff09;技术&#xff0c;专门设计用于物联网&#xff08;IoT&#xff09;设备的远距离通信。其长距离传输和低功耗特性使其在智能城市、环境监测、农业等领域中得到了广泛应用。 一、LOR…

音频分割软件有什么?最方便的音频分割软件分享给你

一段长音频就像是一本厚重的百科全书&#xff0c;而音频剪辑师的任务&#xff0c;就是要将这本书拆分成数个章节&#xff0c;每章都有其独立的主题和内容&#xff0c;这非常考验剪辑师们的音频分割技巧。 幸运的是&#xff0c;随着技术的发展&#xff0c;市面上出现了许多优秀…

每日一题——贪心算法

860. 柠檬水找零 - 力扣&#xff08;LeetCode&#xff09; 这道题目乍一看可能没有什么头绪&#xff0c;但是当你仔细想想就会明白一个道理&#xff0c;那就是&#xff0c;《论电子支付的重要性》哈哈哈哈&#xff0c;言归正传&#xff0c;其实很简单无非就是找钱&#xff0c;…

5个值得关注的AI模型比较平台

AI 正在以极快的速度发展&#xff0c;每周都有新的 AI 模型进入市场。就在一周前&#xff0c;Mixtral AI 发布了一款新模型 Mixtral 8x22B Instruct。它在 MMLU 等多个基准测试中在开源模型中保持了整整 26 小时的性能领先地位。紧接着&#xff0c;LLaMa 3 进入现场&#xff0c…

如何用Python构建高校爬虫与k-means算法实现专业评分可视化分析

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

风清扬/基于Java语言的高能耗企业 水-电-气-热-油-空压机等数据采集系统-能源管理系统-在线监测系统

基于Java语言的高能耗企业 水-电-气-热-油-空压机等数据采集系统-能源管理系统-在线监测系统 介绍适用场景软件架构软件功能数字大屏安装教程参与贡献特技 基于Java语言的高能耗企业 水-电-气-热-油-空压机等数据采集系统-能源管理系统-在线监测系统 介绍 能源管理系统能源管…

python实现自动化生成pdf报告

easypdf使用手册 1. 项目介绍1.1 关于1.2 easypdf 有什么优势1.2 easypdf 可以用来做什么1.3 项目框架1.4 项目教程视频 2. 安装项目环境2.1 安装Python32.2在Windows上安装Python32.3 在Mac上安装Python32.4 在Linux上安装Python32.5 在Windows上安装Pycharm2.6 在Mac上安装Py…