【数据结构】-------求多出口迷宫的最短路径

迷宫求解3--带环的多出口迷宫求最短路径 假如有以下带环的多出口迷宫地图: 这里的思路与之前迷宫求解多出口求最短路径相似,不同的是,这里需要多传一个参数pre,保存当前要落脚的点的上一次走到这个点的大小 1.判定当前点是否能落脚 2.如果能落脚,进行标记,同时将当前点插入到cur_path栈中,更新pre 3.判断是否是出口 a)如果是出口,就比较cur_path与short_path的大小,如果cur_path小就代替s 阅读详情

上面我们已经写过递归和非递归来实现求解迷宫的问题,今天我们就在递归的基础上实现多条通路,最短问题。
初始化最短路径地图

 /////////////////////////////////////////////////
//////////////多通路最短路径/////////////////////
////////////////////////////////////////////////
void MazeInitShortPath(Maze*  maze){
   int map[ROW][COL]={
       {0,1,0,0,0,0},
       {0,1,1,0,0,0},
       {0,1,0,1,1,1},
       {1,1,1,0,0,0},
       {0,0,1,0,0,0},
       {0,0,1,0,0,0},
   };
    int i = 0;
    for (; i<ROW; i++){
        int  j = 0;
        for (; j<COL; j++){
            maze->map[i][j] = map[i][j];
        }
       }
}

用这个特殊的函数来打印栈

//这个函数只用于迷宫问题,用来调试,通常意义下,我们栈不允许
//遍历的,但是如果进行测试或调试,这是个例外
//因此在这里函数虽然进行了遍历,但是仅用于调试
//之所以写这样一个函数遍历栈,为了能够从入口的顺序来打印栈中的内容
void SeqStackDebugPrint(SeqStack* stack, const char* msg){
    printf("%s\n",msg);
    if(stack==NULL){
    return;
    }
    size_t i=0;
    for(;i<stack->size;i++){
    printf("(%d,%d)\n",stack->data[i].row,stack->data[i].col);
    }
    printf("\n");
}
void SeqStackDestroy(SeqStack* stack){
     free(stack->data);
     stack->size=0;
     stack->capacity=0;
}

void _GetShortPath(Maze* maze,Point cur,Point entry,SeqStack* cur_path,SeqStack* short_path)
{
   // 1、判定当前点能否落脚
    if(!CanStay(maze,cur)){
    return;
    }
   //2、如果能落脚,就对当前点进行标记,同时把当前点插入到当前cur_path
    else
    {
    Mark(maze,cur);
    SeqStackPush(cur_path,entry);
    }
   //3、判断当前点是否出口
   if(IsExit(maze,cur,entry)){

   //a、如果当前点是出口,说明当前找到了一条路经,就拿当前路径和short_path中的路径进行比较,
   //如果当前路径比short_path短,或者short_path本身是一个空栈,
   //就用当前路径代替short_path代替完毕之后也要回溯,尝试找其他的路径
   printf("找到了一条路径\n");
   if(cur_path->size<short_path->size||short_path->size==0){
       printf("找到了一条比较短的路径\n");
   }
   SeqStackAssgin(cur_path,short_path);//栈对象赋值
   // b、如果当前路径没有比short_path短,就要尝试着去找其他路径(进行回溯)
   //在回溯之前也要把cur_path栈顶元素也进行出栈

             SeqStackPop(cur_path);
               return;
   }
  //4、如果当前点不是出口,尝试探测四个方向(按照顺时针来探测)
   Point up=cur;
   up.row-=1;
   _GetShortPath(maze,up,entry,cur_path,short_path);
   Point right=cur;
   right.col+=1;
   _GetShortPath(maze,right,entry,cur_path,short_path);
   Point down=cur;
   down.row+=1;
   _GetShortPath(maze,down,entry,cur_path,short_path);
   Point left=cur;
   left.col-=1;
   _GetShortPath(maze,left,entry,cur_path,short_path);

   // 5、如果四个方向都递归探测过了,就可以进行
   // 出栈(指当前函数栈帧结束,同时cur_path,也要进行出栈)回溯到
   //上一个点
  SeqStackPop(cur_path);
  return;
}

核心思路

我们的思路就是尝试找到所有的路径,然后从所有的路径中找到最短的路径

void  GetShortPath(Maze* maze,Point entry){
//和我们从数组中找到最小的数字的思路是一样的
//保存着当前找到的路径
   SeqStack cur_path;
   //保存着最短的路径
   SeqStack short_path;

   SeqStackInit(&cur_path);
   SeqStackInit(&short_path);
  _GetShortPath(maze,entry,entry,&cur_path,&short_path);//辅助递归的函数
   //打印栈中的内容
   SeqStackDebugPrint(&short_path,"最短路径是:");

}

测试函数如下:

void test3(){

        TEST_HEADER;
    Maze maze;
    MazeInitShortPath(&maze);
    MazePrint(&maze);
    Point entry = { 0, 1 };
    GetShortPath(&maze,entry);
    MazePrint(&maze);
}

我们的主要思路就是定义出两个栈,然后让一个存放当前的路径,一个存放的是最小的路径,我们每次用当前的路径和最小的路径进行比较,小的存放在存放最小路径的栈中。

迷宫---多出口迷宫的最短路径 如图是一个有三个出口的迷宫,现在来求它的最短路径(不带环) 思想:定义两个栈,一个栈存放当前路径。一个栈存最短路径,每次都将当前路径和最短路径比较如果当前路径小于最短路径,那就交换两个栈中的元素 代码实现:void MazeInit2(Maze* maze) { if(maze == NULL) { return; } int map[MAX_R 阅读详情

相关推荐

求解多出口迷宫最短路径的问题

求解多出口迷宫的最短路径,是在基于求解简单迷宫是否存在路径的问题的基础上的一个提高。我们首先需要认识到的是,不论是求解简单迷宫问题,还是复杂迷宫的问题,我们都需要基于栈,使用回溯法来解决问题。首先,我们先来定义一个多出口的迷宫:                       图中0表示墙,即无法落脚;1表示可以落脚;之后我们会用2来标记走过的路。我们默认出口为四个边界上的点。若入口也为边界点,则出口...

Cecilia3333的博客 1546

使用GetShortPathName解决unicode路径无法访问

1. 问题简述 在很多项目中,采用char保存数据,这样在含有unicode的路径(eg:中文路径)情况下,会无法访问。 2. 解决方法——GetShortPathName WinAPI提供了一种方法——GetShortPathName:对已经存在的文件,会产生一个ID值,表示这个文件。 3. 具体方法 long length = 0; TCHAR* b

矩阵实验室 3733

数据结构与算法学习之路:迷宫问题——回溯思想找出所有路径

浅析迷宫问题以及找到所有路径和最短路径

追风筝的吃货,汪~ 3801

数据结构--迷宫求解

迷宫求解--C语言太多了不会?跟着我的代码敲,熟能生巧,一个一个模块去做,分治法大事化小。看着代码自己打一遍,能运行就是成功。

m0_62476845的博客 4692

暴力求解走迷宫--基于栈实现最短路径的非递归方法

一个 Datatype arr[N][N] = { { 0,0,0,0,0,0 }, { 0,0,1,1,1,1 }, { 0,0,1,0,1,0 }, { 0,0,1,0,1,0 }, { 0,0,1,1,1,1 }, { 0,0,1,0,0,0 }, };这样6×6的二位数组...

坚持不懈做贡献 1046

Windows (MEX) 上的短路径名和长路径名:Windows 上路径名的长短格式之间的转换-matlab开发

getShortPath 将路径名(或文件名)转换为其缩写形式 (MSDOS 8.3)。 getLongPath 做相反的事情。 在使用 dos 内置函数时,getShortPath 可用于处理格式不正确的路径(例如带有特殊字符或空格的路径名)。 无需在路径名中添加双引号。 例如,用记事本++打开一个命名为“ un fichier malnommé.txt”的文件。 以下命令失败: dos('C:\Program Files (x86)\Notepad++\notepad++.exe un fichier mal nommé.txt') 您需要添加双引号: dos('"C:\Program Files (x86)\Notepad++\notepad++.exe" "un fichier mal nommé.txt"') 或者使用 getShortPath: notepadShor

【数据结构】求多出口迷宫的最短路径

代码如下: Maze.h #pragma once #include typedef struct Pos{ int _Row; int _COL; }Pos; Maze.c #define _CRT_SECURE_NO_WARNINGS 1 #include"Maze.h" #include"Stack.h" /*判断当前路径是否在地图上*/ int CanStay(

Qregi的博客 1083

S32K144-EB tresos GPT驱动模块配置详解

GPT通用计时器,在S32K144这款芯片上,有4个外设模块,最多38各通道可以作为GTP的计时器通道,具体详细的大家可以去看芯片手册。这里咱们只管怎么用EB来配置GPT驱动。

小胡同学的工程师学习之路 3866

【数据结构】求多出口带环迷宫的最短路径

代码如下: Maze.h #pragma once #include typedef struct Pos{ int _Row; int _COL; }Pos; typedef struct Maze{ struct Pos pos; }Maze; Maze.c #define _CRT_SECURE_NO_WARNINGS 1 #include #includ

Qregi的博客 321

UNITY2022 Cardboard环境搭建

必须安装 Git,并且 git 可执行文件必须位于 PATH 环境变量中。考文档:https://developers.google.cn/cardboard/develop/unity/quickstart?转到 Assets/Samples/Google Cardboard//Hello Cardboard/Scenes/HelloCardboard 场景中。粘贴https://github.com/googlevr/cardboard-xr-plugin.git到文本输入字段中。

weixin_39510925的博客 1211

VMware + ubuntu20.04 + qemu安装

遇到报错可参考:(从ubuntu裸系统开始安装)

NosONE 3230

【数据结构】求多出口迷宫的最短路径(递归版本)

Maze.h #pragma once #include typedef struct Pos{ int _Row; int _COL; }Pos; typedef struct Maze{ struct Pos pos; }Maze; Maze.c #define _CRT_SECURE_NO_WARNINGS 1 #include #include"Maze.

Qregi的博客 1749

onnx入门教程(一):解决模型部署中的难题

直接使用 PyTorch 模型的话,我们修改几行代码就能实现模型输入的动态化。但在模型部署中,我们要花数倍的时间来设法解决这一问题。现在,让我们顺着解决问题的思路,体验一下模型部署的困难,并学习使用自定义算子的方式,解决超分辨率模型的动态化问题。刚刚的报错是因为 PyTorch 模型在导出到 ONNX 模型时,模型的输入参数的类型必须全部是 torch.Tensor。而实际上我们传入的第二个参数" 3 "是一个整形变量。这不符合 PyTorch 转 ONNX 的规定。我们必须要修改一下原来的模型的输入。

图像学习之旅 1128

【数据结构】求多出口带环迷宫的最短路径(递归版本)

Maze.h #pragma once #include typedef struct Pos{ int _Row; int _COL; }Pos; typedef struct Maze{ struct Pos pos; }Maze; Maze.c #define _CRT_SECURE_NO_WARNINGS 1 #include #include"Maze.

Qregi的博客 525

Matlab实战:从零搭建弹道导弹六自由度仿真模型(附完整代码)

本文详细介绍了如何使用Matlab从零搭建弹道导弹六自由度仿真模型,涵盖仿真环境配置、核心运动方程实现、气动力建模及仿真结果分析。通过完整代码示例,帮助读者掌握弹道导弹六自由度仿真的关键技术,适用于航空航天工程和复杂系统建模领域。

x8y9z0的博客 947

2023.03.27更新大麦网PC端抢购软件和使用教程

近期发现大麦网页端抢购页面悄然发生变化,之前可以在页面选择票价、档次,并且点击按钮进行购票,现在不行了,新的页面如下图所示。已经安全没有了点击按钮,因此,但是并不代表不能像以前之前那样。

猫敷雪 1万+

多出口迷宫最短路径求解

问题引出 有的时候,除了只有一条出口的迷宫外,我们还会遇到多出口迷宫求解问题,即 有多条出口的迷宫,迷宫内部各路径不交叉,不成环,求其中最短的一条路径 例如: 关于单出口的简单迷宫求解,大家可以参考 简单迷宫求解 解题思路 因为迷宫中存在多条路径,所以这次我们采用自己构造栈的方式进行求解 构建两个栈,一个栈为 cur_path,保存当前走过的路径,另一个栈为 ...

Xucc_x的博客 3023

[系统安全] 一.什么是逆向分析、逆向分析基础及经典扫雷游戏逆向

娜璋AI安全之家于2020年8月18日开通,将专注于Python和安全技术,主要分享Web渗透、系统安全、CVE复现、威胁情报分析、人工智能、大数据分析、恶意代码检测等文章。真心想把自己近十年的所学所做所感分享出来,与大家一起进步。 系统安全系列作者将深入研究恶意样本分析、逆向分析、攻防实战等,通过在线笔记和实践操作的形式分享与博友们学习,希望能与您一起进步。第一篇文章先带领大家学习什么是逆向分析,然后详细讲解逆向分析的典型应用,接着通过OllyDbg工具逆向分析经典的游戏扫雷,再通过Cheat Engin

杨秀璋的专栏 2万+

多出口路径带环最短路径迷宫求解

问题引出 顾名思义,有多条出口的迷宫,迷宫内部各路径有交叉,成环,求其最短路径 例如: 解题思路 整体思路和多出口不带环迷宫最短路径求解一样,只是这次更改的是标记函数 Mark 与 判断是否能够落脚函数 Canstay 因为要判断路径是否带环,以前单一的将走过的路径标记为2已经不能满足我们的需求了 所以这次需要将走过的块标记为当前步数,即每块走过的位置都一个不同的标记,这样,我们就...

Xucc_x的博客 1812

【全网首发】2026华为OD双机位C卷 机考真题题库含考点说明以及在线OJ(OD上机考试双机位C卷)

【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(OD上机考试双机位C卷)

算法大师! 8781

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

本人写的迷宫,不过知道这样才能输出所有的路径

本人写的迷宫,不过知道这样才能输出所有的路径,望各高手刺教#include#include#define M 5#define N 5struct queue{ int x; int y; int pre;}sq[200];int maze[M+2][N+2];typedef struct                    { int dx;  int dy;}moved;moved move

mb459的专栏 1190

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

迷宫求解 :1) 求简单迷宫是否存在路径 ; 2) 求多出口迷宫的最短路径 ;3) 求带环的多出口迷宫的最短路径

迷宫求解的非递归算法应用了之前的栈结构https://blog.youkuaiyun.com/DuckyLoser/article/details/79914855点击打开链接 #include&lt;stdio.h&gt; #include"seqstack.h" #define ROW 6 //行 #define COL 6 //列 typedef struct Maze { int...

DuckyLoser的博客 420

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数据结构---多出口迷宫找出一条最短路径

前面我们实现了基础版本的迷宫求解,只有一条路径。现在如果有多个出口,我们该如何去找到一条最短的路径。 我们先来思考一下我们是如何在一个数组里找最小值的? 有下面一个数组: 我们可以先把第一个数设为最小值,然后遍历数组,拿它和后面的元素进行比较,把两个数中较小的赋给min,直到遍历完整个数组,min中就是数组中的最小值。 同样的,找最短路径也是一样的思路。我们可以定义两个栈,一个cur_...

y6_xiamo的博客 1065

迷宫求解2--多出口求最短路径

假如有如下一个迷宫地图: 与迷宫求解1中,简单迷宫找路径思路相似,不同的是:这里需要定义两个栈cur_path和short_path,来存放当前路径长度,与最短路径长度,每找到一条路径就与最短路径进行比较,如果比最短路径短,就用当前路径cur_path代替最短路径short_path; 1.判定是否能落脚; 2.如果能落脚进行标记,同时将当前点插入到cur_path顺序栈中; 3.判断当

liru_1996的博客 894

迷宫求解问题

迷宫求解问题:1. 简单迷宫是否存在路径(递归以及非递归实现) 2. 多出口迷宫的最短路径 3. 带环的多出口迷宫的最短路径

谢广涛的博客 1091

迷宫求解

1) 求简单迷宫是否存在路径 2) 求多出口迷宫的最短路径 3) 求带环的多出口迷宫的最短路径 seqstack.h: #pragma once #include &lt;stddef.h&gt; #define FOR_MAZE #ifdef FOR_MAZE typedef struct Point{ int row; ...

adorable_的博客 248
上一篇: 【数据结构】-----非递归实现迷宫问题
下一篇: 【恼人】——函数指针 函数指针数组 指向函数指针数组的指针
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值