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.xdnf.cn/news/1475395.html

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

相关文章

使用C++实现ATM系统,谈谈思路及代码实现

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

文华财经盘立方期货通鳄鱼指标公式均线交易策略源码

文华财经盘立方期货通鳄鱼指标公式均线交易策略源码&#xff1a; 新建主图幅图类型指标都可以&#xff01; VAR1:(HL)/2; 唇:REF(SMA(VAR1,5,1),3),COLORGREEN; 齿:REF(SMA(VAR1,8,1),5),COLORRED; 颚:REF(SMA(VAR1,13,1),8),COLORBLUE;

Unity实现安卓App预览图片、Pdf文件和视频的一种解决方案

一、问题背景 最近在开发app项目&#xff0c;其中有个需求就是需要在app软件内显示图片、pdf和视频&#xff0c;一开始想的解决方案是分开实现&#xff0c;也就是用Image组件显示图片&#xff0c;找一个加载pdf的插件和播放视频的插件&#xff0c;转念一想觉得太麻烦了&#x…

张量分解(2)——张量运算(内积、外积、直积、范数)

&#x1f345; 写在前面 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;这里是hyk写算法了吗&#xff0c;一枚致力于学习算法和人工智能领域的小菜鸟。 &#x1f50e;个人主页&#xff1a;主页链接&#xff08;欢迎各位大佬光临指导&#xff09; ⭐️近…

vue3中使用 tilwindcss报错 Unknown at rule @tailwindcss

解决方法&#xff1a; vscode中安装插件 Tailwind CSS IntelliSense 在项目中的 .vscode中 settings.json添加 "files.associations": {"*.css": "tailwindcss"}

桌面快充插线板+伸缩数据线,轻松实现1+1>2

手机、平板、笔记本等电子设备已成为我们日常工作和学习的必备工具。然而,随着设备数量的增加,充电问题也日益凸显。桌面空间有限,多个快充头不仅显得杂乱无章,而且效率低下,无法满足我们高效办公的需求。 在这样的背景下,倍思Nomos氮化镓100W桌面充电站凭借其创新的设计和强大…

HR8870:H桥PWM直流电机驱动IC性能指标和应用方案选型

HR8870芯片描述 HR8870是一款直流有刷电机驱动器&#xff0c;适用于打印机、电器、工业设备以及其他小型机器。两个逻辑输入控制H桥驱动器&#xff0c;该驱动器由四个N-MOS组成&#xff0c;能够以高达4.5A的峰值电流双向控制电机。利用电流衰减模式&#xff0c;可通过对输入进行…

C++基础语法之重载引用和命名空间等

1.C关键字 c的关键字比我们的c语言的关键字多&#xff0c;c包容C语言并对C语言进行了补充&#xff0c;但是我们对关键字的学习是在我们后面逐渐学习的。这里我们的只是提供一个表格对齐了解一下。 2.命名空间 我们c出现了命名空间的概念&#xff0c;用关键字namespace来定义。…

猫咪浮毛太多怎么处理?6年铲屎官最值得买的猫毛空气净化器分享

作为一位拥有6年铲屎经验的铲屎官&#xff0c;家中既有宝宝又有毛孩子的铲屎官家庭来说&#xff0c;空气中的宠物异味和猫毛不仅影响生活质量&#xff0c;更关乎家人的健康。普通空气净化器虽然能够提供基本的空气净化&#xff0c;但对于养猫家庭的特定需求&#xff0c;如去除宠…

【Spring Boot】Spring AOP动态代理,以及静态代理

目录 Spring AOP代理一. 代理的概念二. 静态代理三. JDK代理3.1 重写 invoke 方法进⾏功能增强3.2 通过Proxy类随机生成代理对象 四. CGLIB代理4.1 自定义类来重写intercept方法4.2 通过Enhancer类的create方法来创建代理类 五. AOP源码剖析 总结(重中之重&#xff0c;精华) Sp…

ASP.NET MVC-razor编写-2-svg中使用js+添加事件监听

环境&#xff1a;win10 效果 初始状态&#xff1a; 鼠标移入某个text&#xff08;比如KS primer&#xff09;时&#xff0c;text和连接的线条与箭头都变色&#xff1a; 鼠标移出时回复正常。 如果是移入另一种红色的text&#xff08;比如Cell Sceening Tag&#xff09;&…

第一次构建一个对话机器人流程解析(一)

1.问答机器人的组成 1.1 问答机器人的组成结构图 2. 问答机器人的组成-机器人的个人属性 所谓的机器人一般具备有个人的属性,这些属性固定,形成了机器人的个人偏好 在实现过程中,此处使用一个xml配置文件,配置了机器人的个人年龄、性别、职业等内容,同时包含常见有关于…

可信验证解释

学习目标&#xff1a;可信验证解释 可信验证是一种基于计算机技术和安全机制&#xff0c;用于确保系统、程序或数据的完整性和可信性的方法。以下是关于可信验证的详细解释&#xff1a;一、定义与原理 可信验证指的是利用计算机技术和安全机制&#xff0c;对系统、程序或数据…

一.2 程序被其他程序翻译成不同的格式(编译)

hello程序的生命周期是从一个高级C语言程序开始的&#xff0c;因为这种形式能够被人读懂。然而&#xff0c;为了在系统上运行hello.c程序&#xff0c;每条C语句都必须被其他程序转化为一系列的低级机器语言指令。然后这些指令按照一种称为可执行目标程序&#xff08;也称为可执…

【分布式系统】注册中心Zookeeper

目录 一.Zookkeeper 概述 1.Zookkeeper 定义 2.Zookkeeper 工作机制 3.Zookkeeper 特点 4.Zookkeeper 数据结构 5.Zookkeeper 应用场景 统一命名服务 统一配置管理 统一集群管理 服务器动态上下线 软负载均衡 6.Zookkeeper 选举机制 第一次启动选举机制 非第一次…

U盘管理软件有哪些?3款好用的软件亲测有效!

在数字化办公与数据交换日益频繁的今天&#xff0c;U盘作为便携的存储设备&#xff0c;其重要性不言而喻。 然而&#xff0c;U盘的使用也带来了数据泄露、病毒感染等安全隐患。为了有效管理U盘&#xff0c;确保数据安全与合规性&#xff0c;市场上涌现出了众多U盘管理软件。 小…

揭秘:源代码防泄密的终极秘籍

在当今信息科技高度发达的时代&#xff0c;源代码作为企业最核心的资产之一&#xff0c;其安全性不言而喻。源代码的泄露可能导致企业技术机密被竞争对手获取&#xff0c;进而威胁到企业的市场竞争力和长远发展。因此&#xff0c;源代码防泄密成为了企业信息安全工作的重中之重…

解决win10报“无法加载文件……profile.ps1,因为在此系统上禁止运行脚本”的问题

打开命令行报错 解决方法 使用管理员权限打开PowerShell&#xff1a;WinX, 选择“Windows PowerShell&#xff08;管理员&#xff09;” 输入&#xff1a;Set-ExecutionPolicy -ExecutionPolicy RemoteSigned 输入&#xff1a;y确认修改安全策略 &#xff1a;y确认修改安全策略…

vue + element ui 实现侧边栏导航栏折叠收起

首页布局如下 要求点击按钮,将侧边栏收缩, 通过 row 和 col 组件&#xff0c;并通过 col 组件的 span 属性我们就可以自由地组合布局。 折叠前 折叠后 <template><div class"app-layout" :class"{ collapse: app.isFold }"><div class&…

Java-Sql注入以及如何解决

sql脚本注入: 如果sql语句使用字符串拼接&#xff0c;可能会出现字符串的拼接&#xff0c;导致sql注入。 #是会先进行预编译&#xff0c;传进来的参数通过占位符填入到已经完成编译的语句中去。