今天学到了几个关于图最短路的算法,一个就是Dijkstra 算法,还有一个是Floyd 算法,这道题由于要开门所以我们从每一个点向其他点移动时,花费的时间不一定是1分钟了。所以对于单路径且贬值不同的情况下,就得用Dijkstra 算法了。我们先将该题读入读入后就开始算法详解。

读入过程如下

int bx,by,ex,ey;其中bx,by是起点的位置,ex,ey是终点的位置while(cin>>n>>m){for(int i=0;i<n;i++){for(int i1=0;i1<m;i1++){cin>>mg[i][i1];if(mg[i][i1]==3){bx=i;by=i1;}if(mg[i][i1]==4){ex=i;ey=i1;}}}

之后相当于一个建树过程,跟第一题一样,我们将迷宫中的每一个点具体化,就是数字化取代坐标化,这样比较方便一点。

我们将每一个结点可以到达的结点位置和距离用一个奇妙的方法保存下来,具体如下。

    int begin=bx*m+by;开始结点的数字化int end=ex*m+ey;终点结点的数字化vector<vector<cao> >mig(n*m+10,vector<cao>(0));就是这个方法,我们将该结点能去的位置和距离绑在一起,所以所以在前面有一个typedef pair<int,int>cao;for(int i=0;i<n;i++){for(int i1=0;i1<m;i1++){if(mg[i][i1]==1)continue;如果到不了的话就继续下一次。int sta=i*m+i1;将每一个起点都数字化for(int i2=0;i2<4;i2++){int ux=i+work[i2][0];偏移结点1int uy=i1+work[i2][1];偏移结点2if (ux<0||ux>=n||uy<0||uy>=m||mg[ux][uy]==1)跑出边缘就出去continue;int fin=ux*m+uy;到达偏移位置if(mg[ux][uy]==2)如果该结点的位置是2的话就是花费时间为2{mig[sta].push_back({fin,2});从sta这个点到fin的点花了2分钟}else 其余就是0和4了都是1了{mig[sta].push_back({fin,1}); 从sta这个点到fin的点花了1分钟}}}} 

以上属于一个始初化,接下来就是我们Dijkstra 算法的具体内容了。

如果不会的话推荐一个视频,还可以私信我。

以下链接是为了各位学习算法

因陪女朋友逛街,荣获图灵奖——Dijkstra算法_哔哩哔哩_bilibili

对于此算法我们采取优先队列形式的就是将花费时间最小的结点放在队列头部的方法,之后以该结点为起点,将这个队列头能到达的位置和距离分别入队,并且我们会额外创建两个数组一个储存那个最短距离或时间数,一个存储是不是遍历过这个数组,就是判断是不是已这个点为起点遍历过,当一个点做为起点跑完之后就,让他出队。

具体代码和解释如下

    vector<int>bol(n*m+10,0);判断对应点是否做为起点跑过vector<int>dis(n*m,1e9);存储从起点到对应点的最小时间数dis[begin]=0;始初化,起点时间为0priority_queue<cao,vector<cao>,greater<cao> >you;优先队列,将那个最小距离数始终排在队首you.push({0,begin});将起点入队while(!you.empty())算法结束条件{auto li=you.top();取那个最小距离的那个头you.pop();每一次的出栈操作if(bol[li.second])continue;如果遍历过了就是进入下一个循环bol[li.second]=1;作为起点遍历过了就赋值为1int o=li.second;我们将距离跟结点绑在一起,第二个为当前起点(这个当前起点不一定是最初起点)for(auto op:mig[o])我们在之前把当前起点对应的点和距离绑在一起储存在一个空间里{if(dis[op.first]>dis[o]+op.second)这一步就是此算法的核心要好好理解理解{dis[op.first]=dis[o]+op.second;这个dis[o]存的是从起点到该点的最小距离,
如果从起点到当前位置的距离大于从起点到上一个点的距离加上上一个点到这一个点的距离,
这个时候我们就可以将当前从最初起点到当前点的距离位置更新为这个更小的值,并将其入队。you.push({dis[op.first],op.first});}}} 

这道题的核心就说完了,接下来就是最终代码了。

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int>cao;
int work[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int mg[110][110];
int n,m;
int main()
{int bx,by,ex,ey;while(cin>>n>>m){for(int i=0;i<n;i++){for(int i1=0;i1<m;i1++){cin>>mg[i][i1];if(mg[i][i1]==3){bx=i;by=i1;}if(mg[i][i1]==4){ex=i;ey=i1;}}}int begin=bx*m+by;int end=ex*m+ey;vector<vector<cao> >mig(n*m+10,vector<cao>(0));for(int i=0;i<n;i++){for(int i1=0;i1<m;i1++){if(mg[i][i1]==1)continue;int sta=i*m+i1;for(int i2=0;i2<4;i2++){int ux=i+work[i2][0];int uy=i1+work[i2][1];if (ux<0||ux>=n||uy<0||uy>=m||mg[ux][uy]==1)continue;int fin=ux*m+uy;if(mg[ux][uy]==2){mig[sta].push_back({fin,2});}else {mig[sta].push_back({fin,1}); }}}} vector<int>bol(n*m+10,0);vector<int>dis(n*m,1e9);dis[begin]=0;priority_queue<cao,vector<cao>,greater<cao> >you;you.push({0,begin});while(!you.empty()){auto li=you.top();you.pop();if(bol[li.second])continue;bol[li.second]=1;int o=li.second;for(auto op:mig[o]){if(dis[op.first]>dis[o]+op.second){dis[op.first]=dis[o]+op.second;you.push({dis[op.first],op.first});}}} if(dis[end]>1e9/2)cout<<"unreachable"<<endl;else cout<<dis[end]<<endl;}
} 

7-4 走迷宫II(Dijkstra 算法)相关推荐

  1. 【算法】机器人走迷宫(适用于走迷宫、最短路径算法)-20200412

    标题:机器人走迷宫(适用于走迷宫.最短路径算法) 问题描述: 一块矩形方格,含有障碍和可通行格子,求从某一点到另外一点的最短距离?N*M的矩阵: 其中,1代表障碍,0代表可通行:示例:给定二维矩阵 0 ...

  2. 【算法】机器人走迷宫破壁解法(适用于走迷宫、最短路径算法)-20200412

    标题:机器人走迷宫破壁解法(适用于走迷宫.最短路径算法)-20200412 问题描述: 一块矩形方格,含有障碍和可通行格子,求从某一点到另外一点的最短距离?N*M的矩阵: 其中,1代表障碍,0代表可通 ...

  3. c语言bfs算法走迷宫,使用广度优先算法(BFS)走迷宫

    前面介绍广度优先算法的时候提及了多次走迷宫,我们就真正的走一次迷宫试试! 要求如下: 输入给出迷宫矩阵的行数和列数,并给出迷宫(使用点 (.) 表示路,使用星 (*) 表示障碍物,使用S表示起点,T表 ...

  4. C语言-老鼠走迷宫(深度寻路算法)

    老鼠走迷宫-c语言(基于深度优先的寻路算法) 这个是学校的课设,刚开始有点头疼,但是感觉越做越有意思了,于是就有如下代码,可能相较于大佬还有差距,但是这是我目前所能做的最优的程序了吧! 话不多说,说一 ...

  5. C语言老鼠走迷宫(单路径)算法详细讲解

    最近在学习C语言的一些经典算法,其中遇到了一点困难,导致卡进度了.琢磨了很久,在绘制流程图时,突然灵感大开理解了,老鼠走迷宫算法的奇妙.所以写了这个,一来是方便以后右和我类似的同学自学时,遇到这个问题 ...

  6. 编程题走迷宫_C++程序算法题----迷宫(一)

    题目: 一天蒜头君掉进了一个迷宫里面,蒜头君想逃出去,可怜的蒜头君连迷宫是否有能逃出去的路都不知道.看在蒜头君这么可怜的份上,就请聪明的你告诉蒜头君是否有可以逃出去的路. 输入格式 第一行输入两个整数 ...

  7. 算法:老鼠走迷宫问题

    算法:老鼠走迷宫问题(初) [写在前面] 老鼠走迷宫问题的递归实现,是对递归思想的一种应用. [问题描述] 给定一个二维数组,数组中2表示墙壁,0表示通路,由此数组可展示为一个迷宫图.给定入口位置和出 ...

  8. 老鼠走迷宫php算法,C语言经典算法 - 老鼠走迷官(一)

    C语言经典算法 - 老鼠走迷官(一) 说明老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁,使用1来表 示老鼠的行走路径,试以程式求出由入口至出口的路径. 解法老鼠的走法有上.左.下 ...

  9. 广度优先算法_算法浅谈——走迷宫问题与广度优先搜索

    本文始发于个人公众号:TechFlow,原创不易,求个关注 在之前周末LeetCode专栏当中,我们详细描述了深度优先搜索和回溯法,所以今天我们继续这个话题,来和大家聊聊搜索算法的另一个分支,广度优先 ...

  10. 刷题 BFS 广度优先算法 : 大胖子走迷宫 (python, java)

    刷题 BFS 广度优先算法 : 大胖子走迷宫 (python, java) https://www.lanqiao.cn/problems/234/learning/ http://lx.lanqia ...

最新文章

  1. 并查集(边带权,拓展域)
  2. ACM 中常用的算法有哪些?
  3. 一个可以让你保持专注,用心生活,专心工作的绿色插件
  4. jQuery事件之传递参数
  5. Go Web:HttpRouter路由
  6. 对比文件md5值实现去重文件
  7. dj打碟怎么学_关于DJ入门以及手把手教你如何打碟(转)
  8. JVM上篇:内存与垃圾回收篇--运行时数据区四-程序计数器
  9. 时间换算(UTC是世界协调时,BJT是北京时间)
  10. 推荐一部烂片《东方华尔街》
  11. JAVA程序员就业面试题大全
  12. 打砖块游戏-第12届蓝桥杯Scratch省赛1真题第5题
  13. FIRST集和 FOLLOW集的计算
  14. Python语法小白入门
  15. 谷歌浏览器Console不显示error信息
  16. ORA-32017 ORA-16179
  17. HDU 5976 Detachment 题解(贪心+逆元+前缀和,积)
  18. RTSP 和 RTMP原理 通过ffmpeg实现将本地摄像头推流到RTSP服务器
  19. Linux 查看日历
  20. vue功能之“支付宝支付“

热门文章

  1. 领航机器人广告段子_医院机器人物流科技宣传广告语_段子网收录最新段子
  2. 苏州最新税前税后计算机,苏州税前税后工资计算标准
  3. 蜗居大结局-郭海萍-经典台词
  4. 萤石云视频监控接入详细流程,添加设备,展示视频,云台控制
  5. 锐捷AP组建无线网络-保姆级教程
  6. 团队项目成员与题目(本地地铁查询app)
  7. java获取小数位数_Java获取小数位数 | 学步园
  8. 珍藏,最全面+最完善的Excel条件格式使用手册
  9. java日志:一、JUL使用
  10. 面试中面试官问的一些问题总结