搜索专项---最短路模型


文章目录

  • 迷宫问题
  • 武士风度的牛
  • 抓住那头牛

一、迷宫问题OJ链接

        本题思路:只需要记录各个点是有哪个点走过来的,就能递推得出路径。记录前驱假设从 1,1 这个点向下走到了2, 1,则将2,1这个点的前驱记为1,1。这样,将整张地图 bfs 后,各个点的前驱就被记录了下来。输出路径:经过 bfs ,各个点的前驱已经被记录下来,我们只需要从终点开始,依次找当前节点的前驱,就能一直找到起点,从而得到一条路径。当然,这条路径是终点到起点的路径,倒序输出即为起点到终点的路径。如果 bfs 是从终点开始,则讲过上述步骤,得到的就是从起点到终点的路径,不用倒序输出。

#include <bits/stdc++.h>#define x first
#define y secondtypedef std::pair<int,int> PII;constexpr int N=1010;int n;
int g[N][N];
bool st[N][N];
PII pre[N][N];//储存当前位置的前驱位置
std::queue<PII> q;int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};void bfs(int ax,int ay)
{q.push({ax,ay});st[ax][ay]=true;while(!q.empty()){PII t=q.front();q.pop();for(int i=0;i<4;i++){int a=t.x+dx[i],b=t.y+dy[i];if(a<0||a>=n||b<0||b>=n) continue;if(g[a][b]) continue;if(!st[a][b]){q.push({a,b});pre[a][b]=t;st[a][b]=true;}}}}int main()
{std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);std::cin>>n;for(int i=0;i<n;i++)for(int j=0;j<n;j++)std::cin>>g[i][j];bfs(n-1,n-1);//从终点位置进行遍历PII end(0,0);while (true){std::cout<<end.x<<" "<<end.y<<std::endl;if (end.x == n - 1 && end.y == n - 1) break;end = pre[end.x][end.y];}
}

二、武士风度的牛OJ链接

   本题题解: 从牛的起点,进行 bfs 即可。根据题意,牛走的是日字, 八个点。因此,dx, dy 和之前的四个点是不同的。可以得出:dx = [-2, -1, 1, 2, 2, 1, -1, -2],dy = [1, 2, 2, 1, -1, -2, -2, -1]
具体的:找到牛的起点,从起点开始进行 bfs向八个方向进行探索,判断这八个点是否合法:不越界和牛能走。对于合法的点,记录从起点走过来的距离,也就是上个点的距离+1。将合法的点放入队列。如果在 bfs过程中遇到了终点(干草) ,则返回答案。

#include <bits/stdc++.h>#define x first
#define y secondtypedef std::pair<int,int> PII;constexpr int N=2000;int n,m;
char g[N][N];
int dist[N][N];
std::queue<PII> q;int dx[8] = {-2, -1, 1, 2, 2, 1, -1, -2};
int dy[8] = {1, 2, 2, 1, -1, -2, -2, -1};int bfs(int ax,int ay)
{memset(dist,-1,sizeof dist);dist[ax][ay]=0;q.push({ax,ay});while(!q.empty()){PII t=q.front();q.pop();for(int i=0;i<8;i++){int a=t.x+dx[i],b=t.y+dy[i];if(a<0||a>=n||b<0||b>=m) continue;if(g[a][b]=='*') continue;if(dist[a][b]!=-1) continue;if(g[a][b]=='H') return dist[t.x][t.y]+1;dist[a][b]=dist[t.x][t.y]+1;q.push({a,b});}}}int main()
{std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);std::cin>>m>>n;for(int i=0;i<n;i++) std::cin>>g[i];int ax,ay;for(int i=0;i<n;i++)for(int j=0;j<m;j++)if(g[i][j]=='K'){ax=i;ay=j;}std::cout<<bfs(ax,ay)<<std::endl;return 0;
}

三、抓住那头牛OJ链接

       本题思路: 这道题是一个一维的找最短路径的问题,无论+1,-1,* 2 花费都是1分钟,即权值相同, 所以才能用BFS去找最短路。假设当前点为t , 目标点为k出队扩展循环判断 1、如果t-1小于0了,那就不能走-1的方法 2、如果t+1 大于了N(10的5次方+10 ),就不能走+1的方法。 3、如果t * 2大于了N,也就不能走* 2的方法了。当然三个判断都应该加上此点是否被走过的条件,如果满足条件,就把其入队,出队时判断t是否等于k,如果相等就return距离。那么为什么N要取的比K大一点呢,因为先减1再乘2扩大会比先乘再减一缩小更快的接近K,1、当k为偶数,假设为100,当前点为51,那么减一再乘更快,2、当k为奇数,假设为99,当前点为50,那么先乘再减一时更快一点的。所以N要取的比K大一点,当超过N的时候就不会有这样的区别,一定是先减再乘可以更快的接近K。

#include <bits/stdc++.h>constexpr int N=1e5+10;int n,k;
int dist[N];
std::queue<int> q;int bfs()
{q.push(n);dist[n]=0;while(!q.empty()){auto t=q.front();q.pop();if(t==k) return dist[k];if(t-1>=0&&dist[t-1]==-1){q.push(t-1);dist[t-1]=dist[t]+1;}if(t+1<=N&&dist[t+1]==-1){q.push(t+1);dist[t+1]=dist[t]+1;}if(t*2<=N&&dist[t*2]==-1){q.push(t*2);dist[t*2]=dist[t]+1;}}
}int main()
{std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);memset(dist,-1,sizeof dist);std::cin>>n>>k;std::cout<<bfs()<<std::endl;return 0;
}

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

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

相关文章

LabVIEW智能温度监控系统

LabVIEW智能环境监测系统 介绍了一个基于LabVIEW的智能环境监测系统的开发过程。该系统在实时监测和分析环境参数&#xff0c;如温度、湿度、气体浓度等&#xff0c;以提供精确的数据支持&#xff0c;确保环境安全与健康。通过高效的数据处理和友好的用户界面&#xff0c;系统…

C++联合体详解!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家伙新年快乐&#xff0c;今天我们来了解一下C联合体。 文章目录 1.联合体 1.1联合体的概念 1.2联合体的思想 1.3联合体的作用 1.3.1内存优化 1.3.2二进制数据操作 1.3.3类型转换 1.3.4解决特定问…

人脸追踪案例及机器学习认识

1.人脸追踪机器人初制 用程序控制舵机运动的方法与机械臂项目完全相同。 由于摄像头的安装方式为上下倒转安装&#xff0c;我们在编写程序读取图像时需使用 flip 函数将 图像上下翻转。 现在&#xff0c;只需要使用哈尔特征检测得到人脸在图像中的位置&#xff0c;再指示舵机运…

BUUCTF-Real-[Jupyter]notebook-rce

1、简介 Jupyter Notebook&#xff08;此前被称为 IPython notebook&#xff09;是一个交互式笔记本&#xff0c;支持运行 40 多种编程语言。 如果管理员未为Jupyter Notebook配置密码&#xff0c;将导致未授权访问漏洞&#xff0c;游客可在其中创建一个console并执行任意Pytho…

《UE5_C++多人TPS完整教程》学习笔记2 ——《P3 多人游戏概念(Multiplayer Concept)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P3 多人游戏概念&#xff08;Multiplayer Concept&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译…

研究多态恶意软件,探讨网络安全与AI

前言 近期ChatGPT火遍全球&#xff0c;AI技术被应用到了全球各行各业当中&#xff0c;国内外各大厂商也开始推出自己的ChatGPT&#xff0c;笔者所在公司在前段时间也推出了自研的安全GPT&#xff0c;AI技术在网络安全行业得到了很多的应用&#xff0c;不管是网络安全研究人员、…

手把手教你开发Python桌面应用-PyQt6图书管理系统-修改密码UI设计实现

锋哥原创的PyQt6图书管理系统视频教程&#xff1a; PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

如何编译zlib?

学习文章&#xff1a;windows zlib库编译步骤_nmake 编译 zlib-CSDN博客 记录关键步骤&#xff1a; 打开 执行&#xff1a; 先cd到该目录&#xff1a; C:\Users\xxx\Downloads\zlib-1.2.11\contrib\masmx86 (这是我的zlib源码的下载路径&#xff09; 执行bld_ml32.bat 再…

计算机网络——08应用层原理

应用层原理 创建一个新的网络 编程 在不同的端系统上运行通过网络基础设施提供的服务&#xff0c;应用进程批次通信如Web Web服务器软件与浏览器软件通信 网络核心中没有应用层软件 网络核心没有应用层功能网络应用只能在端系统上存在 快速网络应用开发和部署 网络应用…

三、案例 - MySQL数据迁移至ClickHouse

MySQL数据迁移至ClickHouse 一、生成测试数据表和数据1.在MySQL创建数据表和数据2.在ClickHouse创建数据表 二、生成模板文件1.模板文件内容2.模板文件参数详解2.1 全局设置2.2 数据读取&#xff08;Reader&#xff09;2.3 数据写入&#xff08;Writer&#xff09;2.4 性能设置…

ctfshow-文件上传(web151-web161)

目录 web151 web152 web153 web154 web155 web156 web157 web158 web159 web160 web161 web151 提示前台验证不可靠 那限制条件估计就是在前端设置的 上传php小马后 弹出了窗口说不支持的格式 查看源码 这一条很关键 这种不懂直接ai搜 意思就是限制了上传类型 允许…

通过增加缓存优化斐波那契递归的冗余计算

一、python 斐波那契数列的递归实现存在大量的冗余计算。例如&#xff0c;为了计算fib(n)&#xff0c;我们需要计算fib(n-1)和fib(n-2)&#xff0c;但是在计算fib(n-1)的过程中&#xff0c;我们又会重复计算fib(n-2)。当n的值很大时&#xff0c;这种冗余计算会消耗大量的计算资…