【数据结构】------多通路带环迷宫求最短路径(C语言)

C语言实现创建迷宫及求解最短路径 迷宫生成算法采用了深度优先搜索,最短路径求解算法采用了广度优先搜索。通过这两个算法的组合,我们可以生成一个随机的迷宫,并在其中求解出一条最短路径。为了表示迷宫,在C语言中,我们可以使用二维数组。迷宫的每个格子可以表示为一个0或1,0表示可以通过,1表示不能通过。在这个例子中,迷宫的大小为5x5,其中(0, 0)表示起点,(4, 3)表示终点。我们需要找到一条从起点到终点的最短路径。迷宫是一个有趣的问题,我们可以用计算机来创建和解决迷宫。迷宫的生成算法有很多种,本文介绍一种常见的深度优先搜索算法。 阅读详情

思路:在解决之前的函数时,我们判断函数是否可以落脚,标记可落脚的函数都是通用的,而现在由于迷宫的通路是带环的,如果我们在使用上面提到的不带环的多通路求最短路径的方法,肯定这种结果是错误的,所以对于带环的迷宫求解我们再也不能像以前简单的标记为2,我们应该标记的是走过的步数,这样我们判断是否能落脚时,可以直接判断下一步的步数是否比我们即将标记的步数大,如果大的话,就继续进行落脚标记,否则就不可以。

1) 判断当前点是否能落脚,不能落脚就直接返回
2)能落脚就标记当前点,并且将当前点插入到cur_path中
3) 判定当前点是否为出口,是出口就说明找到了一条路
4) 将这条路与最短路径进行比较,把比较短的路径保存到最短路径当中
5) 不管当前路径是否为最短路径都要进行回溯,回溯到前一个点继续进行查找其他的路径
6)如果不是出口,就探测相邻的4个点,(采用顺时针的方法进行回溯)每探测一个点就调用函数本身,重复1~6的动作。
7)如果我们的四个方向都进行探测过了,就可以进行出栈了(cur_path,short_path的栈顶元素进行出栈)回溯到上一个点

代码的实现:


/////////////////////////////////////////////////////////
/////////////////带环多通路最短路径//////////////////////
/////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////


void MazeInitCycle(Maze *maze)
{
    int map[ROW][COL] =
    {
        { 0, 1, 0, 0, 0, 0 },
        { 0, 1, 1, 1, 0, 0 },
        { 1, 1, 0, 1, 0, 0 },
        { 0, 1, 1, 1, 1, 1 },
        { 0, 1, 0, 0, 0, 0 },
        { 0, 1, 0, 0, 0, 0 }
    };
    int i = 0;
    for (; i < ROW; i++)
    {
        int j = 0;
        for (; j < COL; j++)
        {
            maze->map[i][j] = map[i][j];
        }
    }
}
//判断是否能落脚的函数
int CanStayWithCycle(Maze *maze, Point cur, Point pre)
{
    //在地图外的点都不能落脚
    if (cur.row < 0 || cur.row >= ROW || cur.col < 0 || cur.col >= COL)
    {
        return 0;
    }
    //在地图内的点,且值为1就能直接落脚
    int cur_value = maze->map[cur.row][cur.col];
    int pre_value = maze->map[pre.row][pre.col];
    if (cur_value == 1)
    {
        return 1;
    }
    //当前点如果已经走过了,比较cur对应的值和pre对应的值
    //cur-value = 7,pre-value = 5应该落脚
    //cur-value = 6,pre-value = 5不应该落脚
    //cur-value = 5,pre-value = 5不应该落脚
    //cur-value = 4,pre-value = 5不应该落脚

    //cur-value > pre-value+1就应该落脚
    if (cur_value > pre_value + 1)
    {
        return 1;
    }
    return 0;
}
//标记函数
void MarkWithCycle(Maze *maze, Point cur, Point pre)
{
    if (pre.row == -1 && pre.col == -1)
    {
        //针对入口点进行标记,此时的pre是一个非法点
        //不能根据pre_value+1的方法进行标记
        //由于地图中我们用1表示路,所以这里对于入口点直接标记为2,所以对于后面的标记的数字的意义就是对该数字-1就是从入口点走到该点的所需的步数
        maze->map[cur.row][cur.col] = 2;
        return;
    }
    int pre_value = maze->map[pre.row][pre.col];
    maze->map[cur.row][cur.col] = pre_value + 1;
}
//每次走到下一个点都会递归的调用这个函数
void GetCycleShort(Maze *maze, Point cur, Point pre, Point entry, SeqStack *cur_path, SeqStack *short_path)
{
    if (maze == NULL || cur_path == NULL || short_path == NULL)
    {
        return;
    }
    //判断当前点是否能落脚(判定规则改变了)
    if (!CanStayWithCycle(maze, cur, pre))
    {
        //不能落脚就直接返回
        return;
    }
    //能落脚就把当前点标记(标记规则也改变了)并且入cur_path栈,cur_path栈保存着我们走过的路径
    MarkWithCycle(maze, cur, pre);
    SeqStackPush(cur_path, cur);
    //更新pre的值,后续判断是否可以落脚标记
    pre = cur;
    //判定当前点是否为出口
    if (IsExit(maze, cur, entry))
    {
        //是出口说明找到了一条路
        printf("找到了一条路\n");
        //将cur_path与short_path进行比较
        if (short_path->size == 0 || cur_path->size < short_path->size)
        {
            printf("找到了一条比较短的路\n");
            //把比较短的路径保存到short_path栈中
            SeqStackAssgin(cur_path, short_path);
        }
        //不管当前的路径是否为最短的路径都要进行回溯,回到前一个点继续找其他的路径
        SeqStackPop(cur_path);
        return;
    }
    //如果不是出口,以当前点为基准点,探测相邻的四个点
    Point up = cur;
    up.row--;
    GetCycleShort(maze, up, pre, entry, cur_path, short_path);

    Point right = cur;
    right.col++;
    GetCycleShort(maze, right, pre, entry, cur_path, short_path);

    Point down = cur;
    down.row++;
    GetCycleShort(maze, down, pre, entry, cur_path, short_path);

    Point left = cur;
    left.col--;
    GetCycleShort(maze, left, pre, entry, cur_path, short_path);

    //如果四个方向都探测过了,就出栈回溯
    SeqStackPop(cur_path);
    return;
}
C语言实现迷宫生成和最短路径求解 首先,我们需要一个表示迷宫的数据结构。我们可以使用二维数组来表示迷宫的格子。迷宫中的墙壁可以用1表示,可以通过的路径可以用0表示。我们可以定义一个大小为n×m的二维数组来表示迷宫。迷宫是一个有趣且常见的问题,可以通过编程来生成迷宫并找到其中的最短路径。在本篇文章中,我将介绍如何使用C语言实现迷宫的生成,并使用广度优先搜索算法求解最短路径。接下来,我们将介绍如何使用广度优先搜索算法来求解迷宫中的最短路径。函数中调用这两个函数来生成并打印迷宫。在这个例子中,迷宫的大小为10×10。函数用于打印迷宫的图形表示。 阅读详情

相关推荐

ESXI添加硬盘时提示 无法创建 VMFS 数据存储 - 无法更改主机配置

ESXI添加硬盘时提示 无法创建 VMFS 数据存储 - 无法更改主机配置1.打开ESXI的SSH2.找到不能添加的硬盘路径3.用SSH操作 1.打开ESXI的SSH 2.找到不能添加的硬盘路径 我的是第一个,找到你要添加但是不能添加的那个硬盘,点进去。 完整的路劲为:1/2 比如我的: /vmfs/devices/disks/t10.ATA_____ST500LT0122D1DG142___________________________________S3PHRNHQ (比较长哈!) 3.用SSH

AI_DOG的博客 2万+

数据结构:带环迷宫如何求最短路径(栈)

遇到下一位为1,或者下一位置大于当前位置,则为通路向后走是,将前一个节点值+1,标记节点按照上-左-右-下的顺序简单迷宫实现:栈结构实现:迷宫出口判断 - 优快云博客 https://blog.youkuaiyun.com/W_J_F_/article/details/80165506 递归实现迷宫:数据结构:递归实现简单迷宫 - 优快云博客 https://blog.youkuaiyun.com/W_J_F_/...

W_J_F_的博客 587

【Claude Code】Claude Code 使用指南

本文介绍了AI编码助手Claude的基础和进阶操作指南。基础部分涵盖启动命令、模式切换(自动编辑/Plan/Yolo模式)、资源监控等核心功能,重点讲解了斜杠命令的使用方法。进阶操作详细说明了CLAUDE.md文件的创建与管理,包括项目规范、代码风格等内容的配置,以及如何通过该文件建立持久上下文。同时提醒了使用过程中的安全风险,建议通过配置文件限制AI对关键代码的访问权限。全文提供了完整的操作指引和安全建议,帮助开发者高效安全地使用Claude进行编码辅助。

大家好,我是敖云岚,一个沉迷代码的 “技术玩家”。擅长 Java、C++ 开发,对 MySQL、Redis、RabbitMQ 等技术也颇有研究。博客里既有硬核技术干货,也有诙谐幽默的编程日常分享。愿和你一起,笑着学技术,快乐敲代码! 1万+

《算法》-4.4-最短路径

最短路径 所谓的最短路径算法,当然得是图中的一个顶点s到另一个顶点w的最短路径,这个w可以是图中的任意的顶点,当然可能并不是所有点都满足存在最短路径,最短路径的存在是需要条件的,其实这个最短即为最优解,所有的最优解问题如果解有限,那么都可以通过枚举来找到最优的那个解,如果解无限而且不能剪枝呢?在无限的解里还存在更优解?那么最短路径问题就是无解的,具体来看,我想大家很容易想到,那就是如果图中存在环

rebornyp的博客 551

Pattern Recognition 投稿过程记录,含Elsevier Latex模板使用

Pattern Recognition 投稿过程记录,含Elsevier Latex模板使用 最近在Pattern Recognition投出了一个文章,纯纯属于是第一次投稿,感觉自己写了一坨屎,事实是这确实也是一坨屎,现在是投了之后在等待一个拒稿的状态。 但是还是记录一下一些流程 1. 下载模板 在出版商Elsevier的栏目里有对于稿件的结构要求,也提供了Latex模板。同时,也给作者提供了Guides, 可以仔细阅读。下面这个连接咱们可以下载到Guides以及看到一些文章的要求。 https://ww

weixin_44153180的博客 3万+

【Zabbix实战之部署篇】Docker部署Zabbix+grafana监控平台

【Zabbix实战之部署篇】docker部署Zabbix+grafana监控平台

jks212454的博客 2577

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

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

Xucc_x的博客 1812

YOLOv11涨点改进 | 全网创新首发、主干改进篇 | CVPR 2025 | RAVLT主干让 YOLOv11 更加强大!通过增强线性注意力机制,特别在小目标和复杂背景的检测上表现突出

本文提出RAVLT主干网络,通过改进YOLOv11的空间特征建模能力,显著提升小物体和复杂背景检测性能。RAVLT采用秩增强线性注意力(RALA)机制,在保持线性计算复杂度的同时解决传统线性注意力低秩问题。RALA通过增强KV缓冲区和输出特征矩阵的秩,提高特征多样性和建模能力。实验表明,RAVLT在ImageNet-1k上达到84.4% Top-1准确率,仅需2600万参数和4.6GFLOPs,性能优于现有线性注意力模型。文章详细介绍了RAVLT模块结构、实现原理及在YOLOv11中的集成方法,包含四种主干

Ai缝合怪、助力小伙伴高效发论文 637

带环迷宫求最短路径

前面介绍了简单的迷宫求解问题, 今天我们就对带环迷宫求出它的最短路径 1.首先来看一个带环迷宫的简单地图                                      在这张迷宫地图中,我们规定入口点的位置entry的坐标是 (0, 1), 同时, 我们给入口点传一个非法坐标,作为入口点的前一个位置(-1, -1). 接下来的思路就和上一篇的思路是一样的的了. 即每次判断当前...

qq_41027326的博客 498

终于找到两个稳定好用的Docker镜像加速源,拉取速度提升几十倍!

国内使用Docker经常遇到镜像拉取慢、超时失败的问题🐳 本文分享两个亲测好用的免费镜像加速源⚡ 实测拉取速度从十几分钟缩短到几十秒,稳定性接近100%📊 支持一键配置脚本,支持多平台使用✨

XiaoqiangClub的博客 952

半小时搞定Yolov5安装配置及使用(详细过程)

Yolov51. 下载Yolov52. 安装Yolov5 在下载配置Yolov5前,先要安装好Anaconda环境,可参考之前博文:最新Anaconda3的安装配置及使用教程(详细过程) 1. 下载Yolov5 首先下载Yolov5源码: Yolov5 Github地址:https://github.com/ultralytics/yolov5 直接git clone到本地工作目录,等待下载完成: Yolov5代码目录架构: 2. 安装Yolov5 源码下完后,下面开始安装Yolov5所需模块,

HowieXue 薛永浩的博客 12万+

在探迷宫(2)--迷宫路径之最优解(带环或不带环)

迷宫问题(1)–课程设计之简单实现(只找出一条通路即可) https://blog.youkuaiyun.com/hansionz/article/details/80901089

HanSion.Z 1095

光学测量仿真软件:Zygo_(5).Zygo的数据处理与分析方法

通过上述综合案例,我们可以看到Zygo中的数据处理与分析方法是如何一步一步应用于实际数据的。从数据导入到预处理,再到滤波、表面分析、缺陷检测和数据可视化,每一步都至关重要,最终确保了数据的准确性和可靠性。处理后的数据还可以导出为多种格式,便于在其他软件中进行进一步的处理或报告。希望这个案例能够帮助您更好地理解和应用Zygo中的数据处理与分析方法。

kkchenjj的博客 946

数据结构:各类迷宫问题详解(c语言版)

第一类 简单迷宫(不含多条出路,不带环)(0代表墙,1代表通路) 思路分析: 1.以入口为起点,寻找出口(除了起点以外的边缘上的点) 2.判定当前点坐标是否可以走。(坐标合法且不为0) 3.如果合法则将当前点标记成走过的并入栈(维护一个栈可以记录走过的路径,栈的长度就是路径的长度) 4.判断当前点是否是出口,是出口就return(该迷宫不存在别的出口),如果不是出口,...

Ferlan的博客 3万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

数据结构---对复杂迷宫进行求解(通路间带环)

我们通常见的迷宫多种多样,在这里以多通路迷宫为例,对迷宫进行求解,找出最短路径,用C语言对其进行编写,涉及到一些操作包括:        1. 初始化迷宫地图数据 --》2. 检测迷宫的入口是否有效 --》 3. 检测当前位置是否为迷宫的出口 --》4. 保存最短路径 --》5. 检测当前位置的下一步是否能够走通 --》6. 走迷宫 --》7. 具体走迷宫方式 --》8. 打印迷宫

eternal_01的博客 601

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

迷宫问题C语言求解

迷宫:1--&gt;通路     非1--&gt;死路简单迷宫 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 1 0 0 1 0 0 0求解:①可以采用循环的方式。需要用到栈,从入口开始,往四个方向走,依次将走过的坐标点--入栈;如果走到“死路”,就出栈;--循环;最后栈中保存的就是出迷宫的路线。求解:②可以采用递归的方式。每走...

qq_33279168的博客 1229

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

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

C语言实现最短迷宫路径问题

C语言实现最短迷宫路径问题 试题:迷宫的最短路径 问题描述 给定一个大小为N*M的迷宫。迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四个的通道移动。请求出从起点到重点所需的最小步数。注意,本题假设从起点不一定可以移动到终点。 试题分析 这是一道经典的宽度优先搜索算法(BFS)试题,BFS中,只要将已经访问过的状态用标记管理起来,就可以很好的做到由进及远的搜索。 此外,还需用到队列的思想先进先出,及第一次程序中到达迷宫某一位置的所需步数并记录下来,这样,当其余路径也经过这一地点时(其BFS次数在第一次到达

m0_54619019的博客 6641

广度优先搜索(BFS)寻找迷宫两点之间最短路径的C语言实现

根据输入的长和宽随机生成一个迷宫,随机生成或者输入一个起点和一个终点,运用广度优先搜索算法,找到这个迷宫中起点到终点的最短路径,并输出结果。

m0_74394521的博客 1844

广度优先算法经典:迷宫最短路径问题(C语言实现)

今年上半年蓝桥杯考了类似的题(基本一样),本人算法菜鸡,考场上头铁用深搜写这个导致爆栈,最近闲下来研究了一下,写了一个找到最短出路的demo 问题描述   学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗。但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要进城堡必须得先通过迷宫。因为班长还有妹子要陪,磨刀不误砍柴功,他为了节约时间,从线人那里搞到了迷宫的地...

qq_40761320的博客 9490

C语言实现,找出迷宫起点到终点的最短路径,最详细的DFS教程

因为蓝桥杯要去参加国赛了,现在要开始备考了,下午学了下DFS的算法,然后输出一下我学到的。 求出迷宫中的最短路径: 一共有两个,一个是未改进的,但是更容易理解,理解了第一个之后,可以更好的理解第二个优化的。 尝试移动的方向,当开始移动时,坐标的变化。 未优化 /* 输入m行,n列数据, p,q表示终点, min表示最短路径 */ int m, n, p, q; int min = 999999999; int a[100][100]; //1表示空,2表示障碍 int v[100][100]; //

s_meng_的博客 4369

用栈求解迷宫问题的所有路径及最短路径程序(纯c语言)

比较关键的是怎么探查出所有的路径。 我的想法是在第一次找到出口时,在输出路径后,就直接退栈,再利用continue结束这次循环。达到回溯道路的作用。 退栈后回到上一个方块 ,换一个方向再继续试探,重复以上的过程即可。 再就是算最短路径,直接再找到出口的时候比较一下top指针就好了

hooty_的博客 6590

随机生成迷宫&寻找最短路径(C语言版)

【代码】随机生成迷宫&寻找最短路径(C语言版)

有朋自远方来,不亦乐乎。 4033

c语言,迷宫最短路径

#include #include #include #define MAX 30//迷宫最大30*30 #define ENDS -2//端点位置标记为-2 #define ROUT -1//入队的路径标记为-1 #define SHORTESTPATH 2//将最终的最短路径标记为2 //队列结构,保存进行广度优先搜索时的路径 typedef struct QueueNo

Allen 9126

迷宫最短路径回溯算法c语言,数据结构 回溯法的应用之迷宫最短路径问题

/ 回溯法倒是不难理解,大家可以叫我迷宫大师了 /题目A maze is to be represented by a 12*12 array composed of three values: Open, Wall, or Exit. There is one exit from the maze. Write a program to determine whether it is possi...

weixin_39855869的博客 797

迷宫最短路径c语言程序,c语言,迷宫最短路径

#include #include #include #define MAX 30//迷宫最大30*30#define ENDS -2//端点位置标记为-2#define ROUT -1//入队的路径标记为-1#define SHORTESTPATH 2//将最终的最短路径标记为2//队列结构,保存进行广度优先搜索时的路径typedef struct QueueNode{int a[2];//记录...

weixin_39836860的博客 2100

多通路迷宫最短路径(寻路加找宝箱)

迷宫寻路加找宝箱图示寻路需求演示代码演示 图示 寻路需求 这次我们在一个多路径迷宫中放置几个宝箱 ,从起点出发找到所有的宝箱之后再寻路到终点。 演示代码 #!/usr/bin/python3.7 # -*- coding: utf-8 -*- import random import pygame import maze # pygame.init() # 初始化pygame size = width, height = 800, 600 # 设置窗口大小 screen = pygame.displ

2421
上一篇: 捕捉信号
下一篇: 线程的基本概念
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值