BFS:边权相同的最短路问题

一、边权相同最短路问题简介

二、迷宫中离入口最近的出口

. - 力扣(LeetCode)

class Solution {
public:const int dx[4]={1,-1,0,0};const int dy[4]={0,0,1,-1};int nearestExit(vector<vector<char>>& maze, vector<int>& e) {int m=maze.size(),n=maze[0].size();queue<pair<int,int>> q;//队列bool check[m][n]; //非全局的bool是乱值 全局的会初始化为0//力扣支持这样的写法memset(check,0,sizeof(check)); //初始化成0q.emplace(e[0],e[1]);check[e[0]][e[1]]=true;int step=0;//统计步数while(!q.empty()){++step;//要控制同一层出int sz=q.size();for(int i=0;i<sz;++i){auto[a,b]=q.front();q.pop();for(int k=0;k<4;++k){int x=dx[k]+a,y=dy[k]+b;if(x>=0&&x<m&&y>=0&&y<n&&maze[x][y]=='.'&&check[x][y]==false){//如果找到最后一个了,就可以直接返回了if(x==0||x==m-1||y==0||y==n-1) return step;//如果没找到,继续进q.emplace(x,y);check[x][y]=true;}}}}return -1;}
};

三、最小基因变化(经典图论bfs)

. - 力扣(LeetCode)

class Solution {
public:
//转化成图论中的bfs问题int minMutation(string startGene, string endGene, vector<string>& bank) {if(startGene==endGene) return 0;string s("AGCT");//四种变化情况unordered_set<string> hash1(bank.begin(),bank.end());//负责帮助我们快速查找字符串是否在基因库中if(hash1.count(endGene)==0) return -1;queue<string> q;//存储在基因库中出现过的变化后字符串q.emplace(startGene);unordered_set<string> hash2;//负责标记哪些字符串被搜索过hash2.insert(startGene);int step=0;//用来统计步数while(!q.empty()){++step;int sz=q.size();//控制一行一行出for(int i=0;i<sz;++i){string temp=q.front();//待处理的字符串q.pop();for(int j=0;j<8;++j) //遍历字符串的每个位置{for(int k=0;k<4;++k){string cur=temp;cur[j]=s[k];//修改if(hash1.count(cur)&&hash2.count(cur)==0)//如果基因库找到了 就丢进去{if(cur==endGene) return step;hash2.insert(cur);q.emplace(cur);}}} }}return -1;}
};

 四、单词接龙

. - 力扣(LeetCode)

class Solution {
public:int ladderLength(string beginWord, string endWord, vector<string>& wordList) {int n=beginWord.size();//需要一个哈希表存储字典中的字符串,方便快速搜索是否存在unordered_set<string> hash(wordList.begin(),wordList.end());//需要一个标记哈希表帮助我们判断被搜索过的字符串 if(!hash.count(endWord)) return 0;unordered_set<string> vis;queue<string> q;vis.insert(beginWord);q.emplace(beginWord);int ret=1;while(!q.empty()){++ret;//要控制一行一行出int sz=q.size();for(int i=0;i<sz;++i){string t=q.front();q.pop();//开始想办法修改for(int j=0;j<n;++j) //遍历字符串的每个位置for(char k='a';k<='z';++k){string temp=t;temp[j]=k;//修改//如果修改后在字典中找到,就可以加入队列中 如果是最终结果就返回if(hash.count(temp)&&!vis.count(temp)){if(temp==endWord) return ret;vis.insert(temp);q.emplace(temp);}}}}return 0;}
};

五、为高尔夫比赛砍树(经典bfs)

. - 力扣(LeetCode)

        转化成多个最短路问题,但是我们需要知道从哪树开始砍,第一个方法就是用map进行存储,可以顺便帮助我们排序,第二个方法就是用vector进行存储,然后sort+lambda表达式解决问题 

策略1:用map

class Solution {
public:typedef pair<int,int> PII;int m,n;const int dx[4]={1,-1,0,0};const int dy[4]={0,0,1,-1};int cutOffTree(vector<vector<int>>& f) {//转化成若干个迷宫问题//得存下标和值 并且要方便排序m=f.size(),n=f[0].size();map<int,PII> hash;//前面存值 后面存下标for(int i=0;i<m;++i)for(int j=0;j<n;++j)if(f[i][j]>1) hash[f[i][j]]=make_pair(i,j); //map会帮助我们排好序//然后按顺序砍树int bx=0,by=0; //初始位置int ret=0;for(auto&it:hash){auto&[a,b]=it.second;int step=bfs(f,bx,by,a,b);if(step==-1) return -1;ret+=step;//往下迭代 bx=a,by=b;}return ret;}bool vis[50][50];int bfs(vector<vector<int>>& f,int bx,int by,int a,int b){ //转化成迷宫问题  从起点到终点的最短路问题if(bx==a&&by==b) return 0; //有可能直接从起始位置开始砍queue<PII> q;//必须要清空之前的数据memset(vis,0,sizeof(vis));q.emplace(bx,by);vis[bx][by]=true;int step=0;while(!q.empty()){//要控制一层一层走++step;int sz=q.size();for(int i=0;i<sz;++i){auto[ex,ey] =q.front();q.pop();for(int k=0;k<4;++k){int x=dx[k]+ex,y=dy[k]+ey;if(x>=0&&x<m&&y>=0&&y<n&&f[x][y]!=0&&vis[x][y]==false){if(x==a&&y==b) return step;//丢进去q.emplace(x,y);vis[x][y]=true;}}}}return -1;}
};

策略2:vector+sort+lambda

class Solution {
public:typedef pair<int,int> PII;int m,n;const int dx[4]={1,-1,0,0};const int dy[4]={0,0,1,-1};int cutOffTree(vector<vector<int>>& f) {//转化成若干个迷宫问题 关键就在于我们怎么确定砍树的顺序//得存下标和值 并且要方便排序m=f.size(),n=f[0].size();//用一个vector存储下标,然后排序的时候用lambda表达式vector<PII> trees;for(int i=0;i<m;++i)for(int j=0;j<n;++j)if(f[i][j]>1) trees.emplace_back(i,j); //sort+lambda 进行排序sort(trees.begin(),trees.end(),[&f](const PII&kv1,const PII&kv2) //lambda捕获f{return f[kv1.first][kv1.second]<f[kv2.first][kv2.second];});//然后按顺序砍树int bx=0,by=0; //初始位置int ret=0;for(auto&[a,b]:trees){int step=bfs(f,bx,by,a,b);if(step==-1) return -1;//说明无路可走了ret+=step;//往下迭代 bx=a,by=b;}return ret;}bool vis[50][50];int bfs(vector<vector<int>>& f,int bx,int by,int a,int b){ //转化成迷宫问题  从起点到终点的最短路问题if(bx==a&&by==b) return 0; //有可能直接从起始位置开始砍queue<PII> q;//必须要清空之前的数据 memset(vis,0,sizeof(vis));//如果不定义成全局的标记数据的话, 也可以定义成局部的标记数组,但同样需要进行初始化q.emplace(bx,by);vis[bx][by]=true;int step=0;while(!q.empty()){//要控制一层一层走++step;int sz=q.size();for(int i=0;i<sz;++i){auto[ex,ey] =q.front();q.pop();for(int k=0;k<4;++k){int x=dx[k]+ex,y=dy[k]+ey;if(x>=0&&x<m&&y>=0&&y<n&&f[x][y]!=0&&vis[x][y]==false){if(x==a&&y==b) return step;//丢进去q.emplace(x,y);vis[x][y]=true;}}}}return -1;}
};

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

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

相关文章

论文阅读:Rethinking Interpretability in the Era of Large Language Models

Rethinking Interpretability in the Era of Large Language Models 《Rethinking Interpretability in the Era of Large Language Models》由Chandan Singh、Jeevana Priya Inala、Michel Galley、Rich Caruana和Jianfeng Gao撰写&#xff0c;探讨了在大型语言模型&#xff…

WVP后端项目文件结构

WVP&#xff08;Web Video Platform&#xff09;是一个基于GB28181-2016标准实现的网络视频平台&#xff0c;负责实现核心信令与设备管理后台部分&#xff0c;支持NAT穿透&#xff0c;支持海康、大华、宇视等品牌的IPC、NVR、DVR接入。支持国标级联&#xff0c;支持rtsp/rtmp等…

使用C#进行MySQL删改查操作

使用C#进行MySQL删改查操作 1.前提准备2.C#中MySQL的向指定数据库中增加数据3.C#中MySQL的向指定数据库中修改数据4.C#中MySQL的向指定数据库中删除数据 1.前提准备 在MySQL官网上下载C#相关的dll&#xff0c;或者在Nuget包中搜索“MySql.Data”&#xff0c;进行下载。 2.C#中…

js函数扩展内容---多参数,函数属性,字符串生成函数

1.多参数 在js中&#xff0c;Math.max()方法可以接受任意数量的参数&#xff0c; Math.max(1,2,3,4);//4 Math.max(1,2,3,4,5,6,7,8,9,10)//10 在max方法里面有一个rest参数&#xff0c;它接受了所有参数全部合成到了一个number数组里面&#xff0c; function rest(a,b,...a…

12 - matlab m_map地学绘图工具基础函数 - 在地图上绘制矢量场m_vec函数和绘制风羽图的m_windbarb函数

12 - matlab m_map地学绘图工具基础函数 - 在地图上绘制矢量场函数m_vec和绘制风羽图的函数m_windbarb 0. 引言1. 关于m_vec2. 关于m_windbarb3. 总结 0. 引言 本篇介绍下m_map中绘制矢量场的函数&#xff08;m_vec&#xff09;和地图上绘制风羽图的函数m_windbarb。 1. 关于m…

【python重复元素判定】

在Python中&#xff0c;判定一个序列&#xff08;如列表、元组等&#xff09;中是否存在重复元素&#xff0c;可以通过多种方法实现。这里列出几种常用的方法&#xff1a; 1. 使用集合&#xff08;Set&#xff09; 集合是一个无序的、不包含重复元素的数据结构。将序列转换为…

QT信号量与槽

文章目录 概述用系统生成新增一个信号量和槽代码方式信号量和槽的宏信号量和槽都用函数地址lamda表达式函数指针 槽和信号量函数信号量槽 小结 概述 这个内容是QT独有的&#xff0c;写的挺有意义的。之前写过一篇QT slots的函数&#xff0c;思来想去&#xff0c;觉得不是那么有…

python-22-零基础自学python-数据分析基础 打开文件 读取文件信息

学习内容&#xff1a;《python编程&#xff1a;从入门到实践》第二版 知识点&#xff1a; 读取文件 、逐行读取文件信息等 练习内容&#xff1a; 练习10-1:Python学习笔记 在文本编辑器中新建一个文件&#xff0c;写几句话来总结一下你至此学到的Python知识&#xff0c;其中…

代码随想录:贪心2-4

455.分发饼干 题目 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j&#xff…

考CISP,不要踩坑的几点建议

当你立志要在信息安全领域闯出一片天&#xff0c;可能多少都会听行内人说&#xff0c;搞本CISP。但这个认证究竟该怎么拿&#xff1f;需要培训吗&#xff1f;培训又是怎么一回事&#xff1f;价格如何&#xff1f;还有&#xff0c;什么时候开始准备最好&#xff1f;这些问题可能…

C++ Lambda表达式第一篇, 闭合(Closuretype)

C Lambda表达式第一篇&#xff0c; 闭合Closuretype ClosureType::operator()(params)auto 模板参数类型显式模板参数类型其他 ClosureType::operator ret(*)(params)() lambda 表达式是唯一的未命名&#xff0c;非联合&#xff0c;非聚合类类型&#xff08;称为闭包类型&#…

【实习问题记录】Nodeclub本地部署

问题描述 在按照官方网站给出的教程一步一步操作以后发现出现以下报错&#xff1a; 问题分析 显示连接不上mongodb&#xff0c;分析报错可能是因为版本不匹配导致的&#xff0c;查看安装的mongodb版本发现是7.0.4&#xff0c;与目标版本不匹配&#xff0c;同时查看mongodb官…

我们所熟知的meme梗图也可以用AI生成了,老外都玩坏了。

meme梗图不知道大家看到过嘛&#xff1f;相信你们看见下面的图你就会大叫“卧槽”&#xff0c;原来是这种图&#xff0c;我以前经常狂刷不止&#xff0c;太有趣了。 其实meme是一个网络流行语&#xff0c;可译为模因。在大众非学术范围内也可翻译为我们所熟知的“梗”。其中“表…

SDK环境的安装(测试使用)

1、安装 将文件解压至目录,我的目录为:D:\Program Files\Android 解压后如下: 下载链接如下: sdk下载 提取码见文章最后: 2、配置环境 1、在环境变量中,选择系统变量,点击新建。 变量名:ANDROID_HOME 变量值:“你自己的android-sdk安装路径” (例如我的:D:\Pro…

CF1955C Inhabitant of the Deep Sea 题解

题目 模拟 首先想到模拟。 但是看到数据范围&#xff0c;模拟不了。 #include<bits/stdc.h> #include<cstring> #include<queue> #include<set> #include<stack> #include<vector> #include<map> #define int long long #define …

如何在 Linux 中高亮显示日志关键字

在 Linux 系统中&#xff0c;实时查看日志文件通常使用 tailf 命令&#xff0c;但 tailf 本身并不支持高亮显示关键字功能。通过结合 grep、sed 等工具&#xff0c;我们可以实现日志关键字高亮。本文将介绍几种高效的方法来实现这一目标。 方法一&#xff1a;使用 grep --color…

人机交互中有许多不满足紧致性条件的地方

紧致性条件通常用于描述拓扑空间的性质。一个拓扑空间被称为紧致的&#xff0c;如果它的任意开覆盖都有有限子覆盖。换句话说&#xff0c;对于任何开覆盖&#xff0c;都可以从中选取有限个开集&#xff0c;它们的并仍然覆盖整个空间。 满足紧致性条件的方法通常包括以下几种&am…

7月8日 四道经典单链表oj题

大家好呀&#xff0c;本博客目的在于记录暑假学习打卡&#xff0c;后续会整理成一个专栏&#xff0c;主要打算在暑假学习完数据结构&#xff0c;因此会发一些相关的数据结构实现的博客和一些刷的题&#xff0c;个人学习使用&#xff0c;也希望大家多多支持&#xff0c;有不足之…

CSS--表格自适应宽度并设置最小宽度

原文网址&#xff1a;CSS--表格自适应宽度并设置最小宽度_IT利刃出鞘的博客、-CSDN博客 简介 本文介绍怎样让HTML的表格自适应宽度。 Java技术星球&#xff1a;way2j.com 问题描述 默认样式下&#xff0c;表格会出现某一列很窄的情况&#xff1a; 代码&#xff1a; <h…

Redission 解锁异常:attempt to unlock lock, not locked by current thread by node id

标题&#xff1a;解锁异常&#xff1a;Redission中的"attempt to unlock lock, not locked by current thread by node id"问题分析与解决方案 在分布式系统中&#xff0c;锁是常用的同步机制&#xff0c;用于保护共享资源&#xff0c;避免并发冲突。Redission是一个…