[Algorithm][BFS][最短路问题][迷宫中离入口最近的出口][最小基因变化][单词接龙][为高尔夫比赛砍树]详细讲解

0.原理讲解

  • 最短路径里的常见问题
  • 本专题主要讲解边权为一的最短路问题
    • 边权全都相同即可,并非只能为一
  • 方法从起点开始,来一次BFS即可
  • 如何找出最短路径是多长呢?
    • 拓展的层数,就是最短路的长度
      请添加图片描述

1.迷宫中离入口最近的出口

1.题目链接

  • 迷宫中离入口最近的出口

2.算法原理详解

  • 思路:BFS
    • 从起点开始层序遍历,并且在遍历的过程中记录当前遍历的层数
      • 这样就能在找到出⼝的时候,得到起点到出⼝的最短距离
    • BFS解决迷宫问题,是最经典的做法

3.代码实现

class Solution 
{int dx[4] = {1, -1, 0, 0};int dy[4] = {0, 0, 1, -1};
public:int nearestExit(vector<vector<char>>& maze, vector<int>& entrance) {int n = maze.size(), m = maze[0].size();vector<vector<bool>> visit(n, vector<bool>(m, false));visit[entrance[0]][entrance[1]] = true;queue<pair<int, int>> q;q.push({entrance[0], entrance[1]});// BFSint step = 0;while(q.size()){step++;int sz = q.size();while(sz--) // 本层{auto [a, b] = q.front();q.pop();// 将下一层入队列for(int i = 0; i < 4; i++){int x = a + dx[i], y = b + dy[i];if(x >= 0 && x < n && y >= 0 && y < m \&& maze[x][y] == '.' && !visit[x][y]){// 判断是否遇到出口if(x == 0 || x == n - 1 || y == 0 || y == m - 1){return step;}visit[x][y] = true;q.push({x, y});}}}}return -1;}
};

2.最小基因变化

1.题目链接

  • 最小基因变化

2.算法原理详解

  • 分析:如果将「每次字符串的变换」抽象成图中的「两个顶点和⼀条边」的话,问题就变成了「边权为 1 的最短路问题」

  • 问题为什么可以这样转化成「边权为 1 的最短路问题」

    • 从源字符串变到目标字符串,可以抽象成从起点到终点
    • 中间的每一次变换,都可以抽象成图中的「两个顶点和⼀条边」
    • 每次都只能变换一个字符,那么可以抽象成两个顶点间,权值均为1
      请添加图片描述
  • 如何枚举出所有的变化情况呢?

    • 直接暴力枚举每一个位置的每一个变化情况即可
  • 枚举出来的所有情况,都需要加入到队列里面吗?

    • 不需要,如果基因库中没有此次变化的结果,那么此次变化就不是一次合法的变化
  • 如何快速判断是否在基因库中存在?

    • hash<string>
  • 细节:用hash<string>来标记搜索过的状态


3.代码实现

int MinMutation(string startGene, string endGene, vector<string>& bank) 
{unordered_set<string> visit; // 用来标记已经搜索过的状态unordered_set<string> hash(bank.begin(), bank.end()); // 存储基因库string change = "ACGT"; // hash// 边界情况处理if(startGene == endGene){return 0;}if(!hash.count(endGene)){return -1;}queue<string> q;q.push(startGene);visit.insert(startGene);// BFSint ret = 0;while(q.size()){ret++;int sz = q.size();while(sz--){string str = q.front();q.pop();// 将下一层入队列// 暴力穷举所有的变化情况:Pfor(int i = 0; i < 8; i++){string tmp = str; // 细节:确保每次只变化一个位置for(int j = 0; j < 4; j++){tmp[i] = change[j];if(tmp == endGene){return ret;}if(hash.count(tmp) && !visit.count(tmp)){visit.insert(tmp);q.push(tmp);}}}}}return -1;
}

3.单词接龙

1.题目链接

  • 单词接龙

2.算法原理详解

  • 分析:如果将「每次字符串的变换」抽象成图中的「两个顶点和⼀条边」的话,问题就变成了「边权为 1 的最短路问题」

  • 问题为什么可以这样转化成「边权为 1 的最短路问题」

    • 从源字符串变到目标字符串,可以抽象成从起点到终点
    • 中间的每一次变换,都可以抽象成图中的「两个顶点和⼀条边」
    • 每次都只能变换一个字符,那么可以抽象成两个顶点间,权值均为1
      请添加图片描述
  • 如何枚举出所有的变化情况呢?

    • 直接暴力枚举每一个位置的每一个变化情况即可
  • 枚举出来的所有情况,都需要加入到队列里面吗?

    • 不需要,如果字典中没有此次变化的结果,那么此次变化就不是一次合法的变化
  • 如何快速判断是否在字典中存在?

    • hash<string>
  • 细节:用hash<string>来标记搜索过的状态

3.代码实现

int LadderLength(string beginWord, string endWord, vector<string>& wordList) 
{unordered_set<string> visit;unordered_set<string> dictionary(wordList.begin(), wordList.end());if(!dictionary.count(endWord)){return 0;}queue<string> q;q.push(beginWord);visit.insert(beginWord);// BFSint count = 0;while(q.size()){count++;int sz = q.size();while(sz--){string str = q.front();q.pop();// 将下一层入队列// 暴力枚举所有可能情况:Pfor(int i = 0; i < beginWord.size(); i++){string tmp = str; // 细节:确保每次只更改一个位置for(char j = 'a'; j <= 'z'; j++){tmp[i] = j;if(dictionary.count(tmp) && !visit.count(tmp)){if(tmp == endWord){return ++count;}q.push(tmp);visit.insert(tmp);}}}}}return 0;
}

4.为高尔夫比赛砍树

  • 思路:将问题转化为若干个「迷宫问题」-> 从入口找出口
    • 先找出砍树的顺序
    • 然后按照砍树的顺序,⼀个⼀个的⽤BFS求出最短路径即可
class Solution 
{typedef pair<int, int> PII;int n, m;bool visit[50][50];// 方向向量数组int dx[4] = {1, -1, 0, 0};int dy[4] = {0, 0, 1, -1};
public:int cutOffTree(vector<vector<int>>& forest) {n = forest.size(), m = forest[0].size();// 找出砍树的顺序vector<PII> trees;for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){if(forest[i][j] > 1){trees.push_back({i, j});}}}sort(trees.begin(), trees.end(), [&](const PII& p1, const PII& p2){return forest[p1.first][p1.second] < forest[p2.first][p2.second];});// 按照顺序砍树int ret = 0;int beginX = 0, beginY = 0;for(auto& [a, b] : trees){int step = BFS(forest, beginX, beginY, a, b);if(step == -1){return -1;}ret += step;beginX = a, beginY = b;}return ret;}// 解决单源权值为一的最短路径问题int BFS(vector<vector<int>>& forest, int beginX, int beginY, int endX, int endY){// 边界情况处理if(beginX == endX && beginY == endY){return 0;}memset(visit, false, sizeof visit); // 每次调用BFS都需要执行,否则影响下次BFSvisit[beginX][beginY] = true;queue<PII> q;q.push({beginX, beginY});int step = 0;while(q.size()){step++;int sz = q.size();while(sz--){auto [a, b] = q.front();q.pop();// 将下一层入队列for(int i = 0; i < 4; i++){int x = a + dx[i], y = b + dy[i];if(x >= 0 && x < n && y >= 0 && y < m \&& forest[x][y] && !visit[x][y]){if(x == endX && y == endY){return step;}visit[x][y] = true;q.push({x, y});}}}}return -1;}
};

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

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

相关文章

在k8s中安装Grafana并对接Prometheus,实现k8s集群监控数据的展示

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Grafana&#xff1a;让数据说话的魔术师》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Grafana简介 2、Grafana的重要性与影响力 …

01-基本概念

1. 到底什么是数据结构&#xff1f; 数据结构是指在计算机中组织和存储数据的方式&#xff0c;它涉及到数据元素之间的关系以及对这些关系进行操作的方法。数据结构可以看作是一种将数据组织起来以便有效使用的方式&#xff0c;它关注数据的组织、存储和操作&#xff0c;以及如…

解决github的remote rejected|git存储库的推送保护

前言 git存储库的推送保护。当你试图推送代码到GitHub仓库时&#xff0c;由于存在与主分支&#xff08;master&#xff09;相关的仓库规则违规行为&#xff0c;推送会被拒绝了。这种保护机制帮助确保只有经过授权和符合规定的代码才能被合并到主分支&#xff0c;从而保护了主分…

上海亚商投顾:沪指创年内新高 化工板块掀涨停潮

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日高开震荡&#xff0c;沪指涨超1%续创年内新高&#xff0c;深成指、创业板指均涨约2%。化工股集体…

SQL 基础 | AS 的用法介绍

SQL&#xff08;Structured Query Language&#xff09;是一种用于管理和操作数据库的标准编程语言。 在SQL中&#xff0c;AS关键字有几种不同的用法&#xff0c;主要用于重命名表、列或者查询结果。 以下是AS的一些常见用法&#xff1a; 重命名列&#xff1a;在SELECT语句中&a…

maven冲突问题

在编写maven当中的依赖时&#xff0c;有时候会出现一些问题&#xff0c;这种问题为Maven的当中的依赖。 在导入依赖的时候&#xff1a;出现了两种依赖发生了版本冲突的问题&#xff1f; <?xml version"1.0" encoding"UTF-8"?> <project xmlns…

VBA 创建透视表,录制宏,自动化报表

目录 一. 数据准备二. 需求三. 准备好报表模板四. 执行统计操作&#xff0c;录制宏4.1 根据数据源创建透视表4.2 填充数据到报表4.3 结束宏录制 五. 执行录制好的宏&#xff0c;自动化报表 一. 数据准备 ⏹数据源1 姓名学科成绩丁志敏语文91李平平语文81王刚语文64张伊语文50…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-13-按键实验

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

自动化运维工具---Ansible

一 Puppet Puppet是历史悠久的运维工具之一。它是一种基础架构即代码(laC)工具&#xff0c;使用户可以定义其基础 架构所需的状态&#xff0c;并使系统自动化以实现相同状态。 Puppet可监视用户的所有系统&#xff0c;并防止任何偏离已定义状态的情况。从简单的工作流程自动…

Mysql数据在磁盘上的存储结构

一. 前言 一行数据的存储格式大致如下所示: 变长字段的长度列表&#xff0c;null值列表&#xff0c;数据头&#xff0c;column01的值&#xff0c;column02的值&#xff0c;column0n的值… 二. 变长字段 在MySQL里有一些字段的长度是变长的&#xff0c;是不固定的&#xff0c;…

设计模式Java实现-工厂模式

✨这里是第七人格的博客✨小七&#xff0c;欢迎您的到来~✨ &#x1f345;系列专栏&#xff1a;设计模式&#x1f345; ✈️本篇内容: 工厂模式✈️ &#x1f371;本篇收录完整代码地址&#xff1a;https://gitee.com/diqirenge/design-pattern &#x1f371; 楔子 记得刚…

Python量化炒股的统计数据图

Python量化炒股的统计数据图 单只股票的收益统计图 查看单只股票的收盘价信息 单击聚宽JoinQuant量化炒股平台中的“策略研究/研究环境”命令&#xff0c;进入Jupyter Notebook的研究平台。然后单击“新建”按钮&#xff0c;创建Python3文件&#xff0c;输入如下代码如下&am…

ComfyUI搭建和注意事项for WIN[笔记]

下载ComfyUI(GitHub - comfyanonymous/ComfyUI: The most powerful and modular stable diffusion GUI, api and backend with a graph/nodes interface.) 从源码上搭建比较麻烦&#xff0c;一般不推荐&#xff0c;所以跑到release里面找一个下载。我的显卡是GeFore GTX 1050 …

STM32编译前置条件配置

本文基于stm32f104系列芯片&#xff0c;记录编程代码前需要的操作&#xff1a; 添加库文件 在ST官网下载标准库STM32F10x_StdPeriph_Lib_V3.5.0&#xff0c;解压后&#xff0c;得到以下界面 启动文件 进入Libraries&#xff0c;然后进入CMSIS&#xff0c;再进入CM3&#xff…

深度学习中的不确定性量化:技术、应用和挑战综述(一)

不确定性量化(UQ)在减少优化和决策过程中的不确定性方面起着关键作用&#xff0c;应用于解决各种现实世界的科学和工程应用。贝叶斯近似和集成学习技术是文献中使用最广泛的两种UQ方法。在这方面&#xff0c;研究人员提出了不同的UQ方法&#xff0c;并测试了它们在各种应用中的…

018、Python+fastapi,第一个Python项目走向第18步:ubuntu24.04 安装cuda和pytorch环境

一、说明 我们安装了pytorch环境之后&#xff0c;会用yolo v9 来测试一下&#xff0c;看8g 显存能不能跑下来&#xff0c;上次用无影云电脑&#xff0c;4cpu8g内存直接爆了&#xff0c;云电脑也死机了&#xff0c;提示一直占用内存不释放&#xff0c;我自己的云电脑不能占用内…

Java中的maven的安装和配置

maven的作用 依赖管理 方便快捷的管理项目依赖的资源&#xff0c;避免版本冲突问题 统一项目管理 提供标准&#xff0c;统一的项目结构 项目构建 标准跨平台&#xff08;Linux、windows、MacOS&#xff09;的自动化项目构建方式 maven的安装和配置 在maven官网下载maven Ma…

【革命启示录】Spring框架:Java开发的“核聚变”能量源!

Hello&#xff0c;我是阿佑&#xff0c;今天给大家整的活是 《Java开发的“核聚变”能量源》 文章目录 Spring框架原理详解一、引言简介目的特点例子 二、背景介绍问题解决方案例子 三、核心概念3.1 控制反转&#xff08;Inversion of Control, IoC&#xff09;定义实现例子与代…

多商户Docker Supervisor进程管理器部署

Dockerfile 根目录下没有Dockerfile的可以复制下面的命令 # 使用基础镜像 FROM leekay0218/crmeb-mer## 复制代码 ## 在本地调试注释掉&#xff0c;使用映射把文件映射进去 #ADD ./ /var/www# 设置工作目录 WORKDIR /var/www# 设置时区为上海 ENV TZAsia/Shanghai RUN ln -sn…

python安装问题及解决办法(pip不是内部或外部命令也不是可运行)

pip是python的包管理工具&#xff0c;使python可在cmd&#xff08;命令行窗口&#xff0c;WinR后输入cmd&#xff09;中执行 针对 “pip不是内部或外部命令也不是可运行” 问题&#xff0c;需要在安装的时候将python添加到环境变量中 上图第三个选项必须勾选才能在cmd中使用pi…