第十二周上机实践—项目5—迷宫问题之图深度优先遍历解法

用图的深度遍历来生成一个迷宫       迷宫问题是计算机算法中的经典问题。迷宫问题自然包括求解迷宫(寻路)和生成迷宫两方面。然而数据结构的教科书中直提到了求解迷宫的最一般的算法。而对如何生成迷宫只字未提。为了验证寻路算法的正确性,一定要先生成一个迷宫才行。从迷宫的入口进入后向前走就会不断遇到岔路。如果我们限定一下这是一座简单迷宫也就是说没有回路的迷宫,那么这座迷宫的所有路径就可以构成一棵以入口为根的树,其上的节点就是迷宫中的一个单位(小方格- -!)。出口为其中的一个节点。那么如何构造这棵树呢?      想想图的深度优先遍历的过程: 阅读详情
/*
 *Copyright(c) 2015,烟台大学计算机学院
 *All rights reserved.
 *文件名称:test.cpp
 *作者:林莉
 *完成日期:2015年11月20日
 *版本:v1.0
 *
 *问题描述:设计一个程序,采用深度优先遍历算法的思路,解决迷宫问题。 
  (1)建立迷宫对应的图数据结构,并建立其邻接表表示。 
  (2)采用深度优先遍历的思路设计算法,输出从入口(1,1)点到出口(M,N)的所有迷宫路径。 
 *输入描述:无
 *程序输出:所得结果。
 */

#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
#define M 4
#define N 4
//以下定义邻接表类型
typedef struct ANode            //边的结点结构类型
{
    int i,j;                    //该边的终点位置(i,j)
    struct ANode *nextarc;      //指向下一条边的指针
} ArcNode;

typedef struct Vnode            //邻接表头结点的类型
{
    ArcNode *firstarc;          //指向第一条边
} VNode;

typedef struct
{
    VNode adjlist[M+2][N+2];    //邻接表头节点数组
} ALGraph;                      //图的邻接表类型

typedef struct
{
    int i;                      //当前方块的行号
    int j;                      //当前方块的列号
} Box;

typedef struct
{
    Box data[MaxSize];
    int length;                 //路径长度
} PathType;                     //定义路径类型

int visited[M+2][N+2]= {0};
int count=0;
void CreateList(ALGraph *&G,int mg[][N+2])
//建立迷宫数组对应的邻接表G
{
    int i,j,i1,j1,di;
    ArcNode *p;
    G=(ALGraph *)malloc(sizeof(ALGraph));
    for (i=0; i<M+2; i++)                   //给邻接表中所有头节点的指针域置初值
        for (j=0; j<N+2; j++)
            G->adjlist[i][j].firstarc=NULL;
    for (i=1; i<=M; i++)                    //检查mg中每个元素
        for (j=1; j<=N; j++)
            if (mg[i][j]==0)
            {
                di=0;
                while (di<4)
                {
                    switch(di)
                    {
                    case 0:
                        i1=i-1;
                        j1=j;
                        break;
                    case 1:
                        i1=i;
                        j1=j+1;
                        break;
                    case 2:
                        i1=i+1;
                        j1=j;
                        break;
                    case 3:
                        i1=i, j1=j-1;
                        break;
                    }
                    if (mg[i1][j1]==0)                          //(i1,j1)为可走方块
                    {
                        p=(ArcNode *)malloc(sizeof(ArcNode));   //创建一个节点*p
                        p->i=i1;
                        p->j=j1;
                        p->nextarc=G->adjlist[i][j].firstarc;   //将*p节点链到链表后
                        G->adjlist[i][j].firstarc=p;
                    }
                    di++;
                }
            }
}
//输出邻接表G
void DispAdj(ALGraph *G)
{
    int i,j;
    ArcNode *p;
    for (i=0; i<M+2; i++)
        for (j=0; j<N+2; j++)
        {
            printf("  [%d,%d]: ",i,j);
            p=G->adjlist[i][j].firstarc;
            while (p!=NULL)
            {
                printf("(%d,%d)  ",p->i,p->j);
                p=p->nextarc;
            }
            printf("\n");
        }
}
void FindPath(ALGraph *G,int xi,int yi,int xe,int ye,PathType path)
{
    ArcNode *p;
    visited[xi][yi]=1;                   //置已访问标记
    path.data[path.length].i=xi;
    path.data[path.length].j=yi;
    path.length++;
    if (xi==xe && yi==ye)
    {
        printf("  迷宫路径%d: ",++count);
        for (int k=0; k<path.length; k++)
            printf("(%d,%d) ",path.data[k].i,path.data[k].j);
        printf("\n");
    }
    p=G->adjlist[xi][yi].firstarc;  //p指向顶点v的第一条边顶点
    while (p!=NULL)
    {
        if (visited[p->i][p->j]==0) //若(p->i,p->j)方块未访问,递归访问它
            FindPath(G,p->i,p->j,xe,ye,path);
        p=p->nextarc;               //p指向顶点v的下一条边顶点
    }
    visited[xi][yi]=0;
}

int main()
{
    ALGraph *G;
    int mg[M+2][N+2]=                           //迷宫数组
    {
        {1,1,1,1,1,1},
        {1,0,0,0,1,1},
        {1,0,1,0,0,1},
        {1,0,0,0,1,1},
        {1,1,0,0,0,1},
        {1,1,1,1,1,1}
    };
    CreateList(G,mg);
    printf("迷宫对应的邻接表:\n");
    DispAdj(G); //输出邻接表
    PathType path;
    path.length=0;
    printf("所有的迷宫路径:\n");
    FindPath(G,1,1,M,N,path);
    return 0;
}


运行结果:

迷宫求解问题算法 任务:以一个m n的长方阵表示迷宫 0和1分别表示迷宫中的通路和障碍 设计一个程序 对任意设定的迷宫 求出一条从入口到出口的通路 或得出没有通路的结论 要求:首先实现一个栈类型 然后编写一个求解迷宫的非递归程序 求得的通路以三元组 i j d 的形式输出 其中 i j 指示迷宫中的一个坐标 d表示走到下一坐标的方向 ">任务:以一个m n的长方阵表示迷宫 0和1分别表示迷宫中的通路和障碍 设计一个程序 对任意设定的迷宫 求出一条从入口到出口的通路 或得出没有通路的结论 要求:首先实现一个栈类型 然后编写一个求解迷宫的非递归 [更多] 立即下载

相关推荐

迷宫遍历的简单算法程序c语言版

迷宫遍历的简单算法程序c语言版 include const a[10][10]={ {0,0,0,0,0,0,0,0,0,0}, {0,0,1,1,0,0,0,0,1,0}, {0,1,1,0,0,1,1,1,1,0}, {0,0,1,0,1,1,0,1,1,0}, {0,0,0,0,0,1,1,1,1,0}, {0,0,1,0,0,0,0,0,1,0}, {0,1,1,1,1,0,0,0,1,0}, {0,1,1,1,1,0,0,0,1,0}, {0,0,0,0,1,1,1,1,1,0}, {0,0,0,0,0,0,0,0,0,0}, }; const v[4]={0,1,0,-1}; const h[4]={1,0,-1,0}; short f[10][10]={0}; short mark[10][10]={0};

数据结构实践——迷宫问题之图深度优先遍历解法

本文是针对[数据结构基础系列(7):图]的实践项目。 【项目 - 迷宫问题之图深度优先遍历解法】   设计一个程序,采用深度优先遍历算法的思路,解决迷宫问题。   (1)建立迷宫对应的图数据结构,并建立其邻接表表示。   (2)采用深度优先遍历的思路设计算法,输出从入口(1,1)点到出口(M,N)的所有迷宫路径。 [模...

weixin_34032827的博客 1871

电脑鼠走迷宫程序(包括等高图制作)

电脑鼠走迷宫程序,包括等高图制作、坐标定位、走弧形弯等。

迷宫问题

题目内容: 定义一个二维数组,例如: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的...

weixin_42997798的博客 412

勇闯迷宫(数据结构实践教程)

这是一个用数据结构编的小程序,不知您修改后能否可以将其变为一个小游戏?

数据结构——迷宫问题

数据结构里的迷宫问题,从文件中读取迷宫文件,然后得出解法,存入新的文件

Red and Black

其实这样的题目一直没怎么想通是怎么回事儿,因为先前知道的宽搜和这个有点混乱。经常做题是好的,本来就天资平平,不努力怎么行。 问题描述: 有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。 输入: 包括多个数据集合。每个数据集合的第一行是两个整数W和H,分别表示x方向和y方向瓷砖...

weixin_30919429的博客 908

【SABRE 3D, SABRE 3DxT,LAM设备】2025年9月10日

前文:SABRE 3D系列机台简介本章节详细阐述了在维护期间锁定电气、机械、热力学及重力组件以及化学管线输入的锁定操作流程,旨在降低人员受伤风险。p42~p55。

weixin_46735260的博客 1614

第12周上机实践项目5 - 迷宫问题之图深度优先遍历解法

问题及代码: /* *Copyright(c)2015,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:test.cpp *作者:颜肖璇 *完成日期:2015年11月20日 *版本号:v1.0 /*

yxxhilda的博客 602

避坑指南:Qwen2.5-VL图片预处理中常见的5个尺寸错误

本文深入解析了Qwen2.5-VL模型在图片预处理环节中开发者最常遇到的五个尺寸错误,包括动态分辨率对齐、宽高比超标、像素数限制等问题。文章结合源码解读,详细剖析了`process_vision_info`函数和`resize`逻辑,并提供了具体的排查流程图与参数设置建议,旨在帮助开发者构建健壮的预处理流水线,有效规避显存溢出与推理失败的风险。

weixin_29290379的博客 176

【华为OD机试真题】390、AI面板识别 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

题目描述 >AI识别到面板上有N(1 ≤ N ≤ 100)个指示灯,灯大小一样,任意两个之间无重叠。   由于AI识别误差,每次别到的指示灯位置可能有差异,以4个坐标值描述AI识别的指示灯的大小和位置(左上角x1,y1,右下角x2,y2),   请输出先行后列排序的指示灯的编号,排序规则:   1、每次在尚未排序的灯中挑选最高的灯作为的基准灯   2、找出和基准灯属于同一行所有的灯进行排序。两个灯高低偏差不超过灯半径算同一行(即两个灯坐标的差 ≤ 灯高度的一半)

KJ.JK 1804

数据结构 深度优先 迷宫问题代码

Code: #include    #include    #include    using namespace std;      struct coor {       int x, y;       bool operator == (coor a)       {     

ACMer 1997

YOLOv13改进策略【特征提取层】| 引入注意力卷积模块RFAConv,关注感受野空间特征 助力yolov13精度提升

RFAConv:创新空间注意力和标准卷积运算感受野空间特征是针对卷积核设计的,根据卷积核大小动态生成。以3×3卷积核为例,它由非重叠滑动窗口组成,每个窗口代表一个感受野滑块。

Limiiiing的博客 360

JS手撸数据结构系列 (五) ——图的遍历与迷宫求解

迷宫问题求解在上一篇文章中实现了随机迷宫的算法,这一节当然要实现迷宫求解啦,先上效果图。源代码及在线预览广度优先遍历(BFS)广度优先搜索算法(Breadth-First-Search),又译作宽度优先搜索,或横向优先搜索,简称BFS,是一种图形搜索算法。使用队列实现。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。 我们使用类似的思想,先找到所有与起

scargtt的博客 900

小龙虾 OpenClaw 权限全攻略:轻松激活 elevated (最新版 OpenClaw 自动化任务降智、无权限、无法执行sudo等系统命令、提升 elevated 权限的解决方案)

升级小龙虾 OpenClaw 后权限不足?elevated 报错?📛 本文教你如何正确配置 OpenClaw 权限💻,让自动化任务顺利执行 🚀

XiaoqiangClub的博客 733

SAP项目中 Waterfall vs Agile 的深度对比分析背景:方法论的演进SAP项目实施方法论经历了显著的代际更替。早期以 ASAP(Accelerated SAP) 为代表,采用经典瀑

本文对比分析了SAP项目实施中瀑布模型(ASAP)与敏捷方法(SAP Activate)的核心差异。瀑布模型采用线性流程,需求固定但变更成本高;敏捷方法则通过迭代开发实现动态调整,强调最佳实践和用户持续参与。文章指出,SAP系统的复杂性使纯粹敏捷难以实施,需在标准化与定制化间取得平衡。最终建议根据项目特性选择方法论:稳定需求适用瀑布模型,变化频繁则推荐敏捷,而SAP Activate本质上是两者的结构化融合,代表未来趋势。关键在于匹配项目实际需求,而非盲目追随方法论潮流。

金牌架构师 345

用图搜索方法求解迷宫问题

/** * 实验题目: * 用图搜索方法求解迷宫问题 * 实验目的: * 深入掌握图遍历算法在求解实际问题中的应用。 * 实验内容: * 编写一个程序,完成如下功能: * 1、建立一个迷宫对应的邻接表表示。 * 2、采用深度优先遍历算法输出从入口(1,1)到出口(M,N)的所有迷宫路径。 * 本实验采用深度优先遍历算法求...

xiezhi123456的博客 5606

华为OD机考2025C卷 - 精准核酸检测(Java & Python& JS & C++ & C语言)

华为OD机考2025C卷 - 精准核酸检测,提供在线OJ Java & Python& JS & C++ & C

算法大师! 2881

迷宫问题之图深度优先遍历解法

已知图的邻接表如图3所示,根据算法,则从顶点0出发按深度优先遍历的结点序列是_  0123

fj的博客 1431

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

项目5-- 迷宫问题之图深度优先遍历解法

 /*    * Copyright (c) 2015, 烟台大学计算机与控制工程学院    * All rights reserved.    * 文件名称:main.cpp,graph.h,graph.cpp * 作者:张志康   * 完成日期:2015年11月16日    * 版本号:vc++6.0    *    * 问题描述:  设计一个程序,采用深度优先遍历

天道酬勤 1095

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

第十二周--迷宫问题之图深度优先遍历

/ 作 者:孙子策 完成日期:2016.11.17 问题描述:设计一个程序,采用深度优先遍历算法的思路,解决迷宫问题。   (1)建立迷宫对应的图数据结构,并建立其邻接表表示。   (2)采用深度优先遍历的思路设计算法,输出从入口(1,1)点到出口(M,N)的所有迷宫路径。 [模型建立]   将迷宫中的每一格作为一个顶点,相邻格子可以到达,则对应的顶点之间存在边

sunsunzice的博客 435

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: 第十二周上机实践—项目4—利用遍历思想求解图问题
下一篇: 第十三周上机实践—项目1—验证算法(1)Prim算法的验证
Zero_LinLi
博客等级 码龄11年 15粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值