数据结构实验:用栈求解迷宫问题的所有路径及最短路径

news2024/10/12 7:26:03

用栈求解迷宫问题的所有路径及最短路径

题目描述

编写一个程序exp3-5.cpp,改进《教程》3.1.4节中的求解迷宫问题程序,要求输

如图3.9所示的迷宫的所有路径,并求第一条最短路径及其长度。

在本实验中用mg作为迷宫数组,用St数组作为顺序栈,Path数组保存一条迷宫径,将它们都设置为全局变量。

功能算法如下:

· mgpath(int xi,int yi,int xe,int ye):求解迷宫问题,即输出从入口(xi,yi)到出口(xe,ye)的全部路径和最短路径(包含最短路径长度)。与《教程》3.1.4节中的求解迷宫问题程序相比,其改进的方法是当找到一条路径时不使用return语句退出,而是出栈一次,重新回溯走另一条路径并输出,并用minlen记录最短路径长度,用Path数组记录最短路径。

· dispapath():输出一条路径并求最短路径。

· dispminpath():输出第一条最短路径及其长度。

运行代码

#include<stdio.h>
#define M 4
#define N 4
#define MaxSize 100
// 定义迷宫数组
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 } };
// 定义结构体表示路径中的位置和方向
struct {
    int i, j;
    int di;
} St[MaxSize], Path[MaxSize];//定义栈和存放最短路径的数组
int top = -1;                //栈顶指针
int count = 1;               //路径数计数
int minlen = MaxSize;        //最短路径长度
// 输出一条路径并求最短路径
void dispapath()
{
    int k;
    // 输出第 count 条路经
    printf("%5d:", count++);
    for (k = 0; k <= top; k++)
    {
        // 输出路径中的每个位置
        printf("(%d,%d)", St[k].i, St[k].j);
    }
    printf("\n");
    if (top + 1 < minlen)    //比较最短路径
    {
        for (int k = 0; k <= top; k++)
        {
            // 将当前路径复制到最短路径数组中
            Path[k] = St[k];
        }
        minlen = top + 1;
    }
}
// 输出最短路径
void dispminpath()
{
    printf("最短路径如下:\n");
    // 输出最短路径长度
    printf("长度:%d\n", minlen);
    printf("路径:");
    for (int k = 0; k < minlen; k++)
    {
        // 输出最短路径中的每个位置
        printf("(%d,%d)", Path[k].i, Path[k].j);
    }
    printf("\n");
}
// 寻找迷宫路径
void mgpath(int xi, int yi, int xe, int ye)
{
    int i, j, i1, j1, di;
    bool find;
    top++;
    St[top].i = xi; // 将起始位置压入栈
    St[top].j = yi;
    St[top].di = -1;
    mg[xi][yi] = -1;
    while (top > -1)
    {
        i = St[top].i; j = St[top].j;
        di = St[top].di;
        if (i == xe && j == ye)
        {        
            dispapath(); // 输出当前路径并更新最短路径相关信息
            mg[i][j] = 0;
            top--;
            i = St[top].i; j = St[top].j;
            di = St[top].di;
        }
        find = false;
        while (di < 4 && !find)
        {
            di++;
            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)find = true;
        }
        if (find)
        {
            St[top].di = di;
            top++;
            St[top].i = i1; St[top].j = j1;
            St[top].di = -1;
            mg[i1][j1] = -1;
        }
        else
        {
            mg[i][j] = 0;
            top--;
        }
    }
       dispminpath(); // 输出最短路径
}
int main()
{
    printf("迷宫所有列途径如下:\n");
    // 从左上角 (1,1) 到右下角 (M,N) 寻找路径
    mgpath(1, 1, M, N);
    return 1;
}

代码思路

一、整体架构

  1. 首先定义了迷宫的大小 M 和 N,以及一个用于存储路径的结构体和两个用于存储路径的数组 St 和 Path。还定义了一些变量用于记录栈顶指针、路径计数和最短路径长度等。
  2. 定义了三个主要函数:dispapath 用于输出一条路径并更新最短路径信息;dispminpath 用于输出最短路径;mgpath 是核心函数,用于在迷宫中寻找路径。
  3. 在 main 函数中调用 mgpath 函数,传入起点和终点坐标,启动路径搜索过程。

二、函数功能详解

  1. mgpath 函数

    • 初始化:将起点坐标压入栈 St,并将起点位置在迷宫数组 mg 中标记为已访问(设为 -1)。
    • 循环搜索:通过一个 while 循环不断探索迷宫,直到栈为空(top > -1)。
      • 检查当前位置是否为终点:如果是终点,调用 dispapath 输出当前路径,并将终点位置在迷宫中重新设为可通行(设为 0),然后调整栈顶指针,准备继续搜索其他路径。
      • 寻找下一个可通行位置:如果当前位置不是终点,通过一个内循环不断尝试四个方向(上、右、下、左),找到下一个可通行位置(值为 0 的位置)。如果找到,更新当前位置的方向,将新位置压入栈,并在迷宫中标记新位置为已访问。如果没有找到可通行位置,将当前位置在迷宫中重新设为可通行,然后调整栈顶指针回退。
    • 输出最短路径:搜索结束后,调用 dispminpath 输出最短路径。
  2. dispapath 函数

    • 输出当前路径编号和路径中的每个位置。
    • 如果当前路径长度小于最短路径长度,将当前路径复制到 Path 数组中,并更新最短路径长度。
  3. dispminpath 函数:输出最短路径的长度和路径中的每个位置。

三、数据结构的运用

  1. 迷宫数组 mg:用于表示迷宫的布局,其中 1 表示墙壁,0 表示可通行的路径。
  2. 结构体和数组:定义了一个结构体表示路径中的位置和方向,使用两个数组 St 和 Path 分别作为栈和存储最短路径的数组。栈用于存储当前正在探索的路径,而 Path 数组用于存储最短路径。

实验小结

一、实验目的与成果

本次实验的目的是在给定的迷宫中找到从起点到终点的路径,并输出所有路径以及最短路径。通过这段代码,成功地实现了以下功能:

  1. 利用深度优先搜索算法,借助栈数据结构对迷宫进行遍历,找到了从起点到终点的所有可能路径。
  2. 输出了所有路径的编号以及路径中的每个位置,清晰地展示了探索过程中的各种路径情况。
  3. 确定并输出了最短路径的长度和具体位置序列,为用户提供了迷宫的最优解。

二、遇到的问题及解决方法

  1. 路径准确性问题

    • 问题表现:在实验过程中,可能会出现输出的路径不准确或者最短路径计算错误的情况。
    • 解决方法:仔细检查代码中的逻辑,特别是在路径长度比较和最短路径更新的部分。确保在判断路径长度和复制路径到最短路径数组时的逻辑正确。同时,检查在探索迷宫过程中对位置的标记和回溯操作是否准确无误。
  2. 边界处理

    • 问题表现:在探索迷宫时,可能会出现数组越界的错误,尤其是在探索新位置时。
    • 解决方法:在代码中添加对新位置的合法性检查,确保新位置在迷宫范围内。在计算不同方向的新位置坐标时,仔细检查是否超出了迷宫的边界,避免出现越界访问的情况。
  3. 路径唯一性和最短路径选择

    • 问题表现:代码可能会找到重复的路径,并且在存在多条最短路径时可能只输出其中一条。
    • 解决方法:可以考虑使用标记数组来记录已经访问过的位置,避免重复探索相同的路径。对于最短路径的输出,可以根据具体需求进行调整,例如输出所有长度相同的最短路径,或者根据特定规则选择其中一条作为最终的最短路径。

三、实验收获与体会

  1. 数据结构与算法的应用:通过这个实验,深入理解了栈在深度优先搜索算法中的重要作用。栈的后进先出特性非常适合记录路径的回溯过程,能够有效地实现迷宫路径的搜索。同时,对深度优先搜索算法的理解也更加深刻,掌握了如何运用该算法解决实际问题。

  2. 问题解决能力:在实验过程中,遇到了各种问题,通过分析问题、调试代码和查阅资料,提高了问题解决能力和编程技巧。学会了如何运用逻辑分析和调试工具来找出代码中的错误,并采取有效的措施进行修复。

  3. 代码优化意识:在解决问题的过程中,意识到代码的性能和可读性可以进一步优化。例如,可以使用更高效的算法来提高搜索效率,或者改进变量命名和添加注释来提高代码的可读性和可维护性。

  4. 团队合作与交流:如果是在团队中进行实验,可以与团队成员进行交流和讨论,分享解决问题的经验和方法。团队合作可以提高实验的效率和质量,同时也可以学习到其他人的编程思路和技巧。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

47 C 语言实战项目——家庭收支记账软件

目录 1 需求说明 1.1 菜单显示 1.2 登记收入 1.3 登记支出 1.4 显示收支明细 1.5 退出 2 流程分析 2.1 总流程图 2.2 登记收入流程图 2.3 登记支出流程图 2.4 收支明细流程图 2.5 退出流程图 3 代码实现 3.1 框架搭建 3.2 收支明细功能 3.3 登记收入功能 3.4 …

解决UOS操作系统vim内容鼠标选中后进入可视模式,无法复制问题

现象&#xff1a; 在 vim 插入模式中右键单击出现可视模式&#xff0c;如下图 解决方法&#xff1a; 1. 编辑文件 rootkylin-PC:~# vi /usr/share/vim/vim81/defaults.vim 改为

ANSYS Workbench多边形骨料及界面过渡区混凝土细观模型

混凝土细观模型是一种用来研究混凝土材料内部结构和性能的分析方法。它主要关注于混凝土中不同组分&#xff08;如骨料、水泥浆体等&#xff09;之间的相互作用以及这些相互作用如何影响整体材料的行为。在建立这样的模型时&#xff0c;考虑到多边形骨料及其与周围基质之间形成…

【含文档】基于Springboot+Android的环境保护生活App(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

Jenkins入门:流水线方式部署多模块Springboot项目

目录 一、环境准备 1. 搭建配置Jenkins (在上一篇基础上进行) 2. 安装mysql 3. 安装redis 4. 配置docker-componse 5. 启动docker-componse 二、脚本准备 1. Jenkinsfile 2. deploy.sh 3. Dockerfile 三、Jenkins流水线配置 新增版本号参数 流水线选择代码里面的Je…

ffmpeg面向对象——rtsp拉流探索(1)

目录 1.tcp创建及链接的流程图及对象图2.解析 标准rtsp协议的基石是tcp&#xff0c;本节探索下ffmpeg的rtsp拉流协议tcp的socket创建及链接。 1.tcp创建及链接的流程图及对象图 tcp创建及链接的流程图&#xff0c;如下&#xff1a; tcp创建及链接的对象图&#xff0c;如下&…

QD1-P15 HTML 文本标签(textarea、label)

本节学习 HTML 常用标签&#xff1a;textarea和label ‍ 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p15 ‍ 知识点1&#xff1a;textarea标签的用途 可输入多行文本的控件 cols属性&#xff1a; 文本的可见宽度 rows属性&#xff1a; 文本的可见行数 HTML示例 &l…

Map父接口

通过API可以详细查看Map接口包含的具体方法。重点的方法包括&#xff1a; 案例一&#xff1a;Map接口的基本使用 package com.map;import java.util.HashMap; import java.util.Map; import java.util.Set;/*** Map接口的使用* 特点&#xff1a;存储键值对&#xff1b;键不能重…

【数据结构】零碎知识点(易忘 / 易错)总结回顾

一、数据结构的概念 数据结构&#xff08;Data Structure&#xff09;是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合。 二、算法 算法&#xff08;Algorithm&#xff09;就是定义良好的计算过程&#xff0c;它取一个或一组的值为…

Python、R语言Lasso、Ridge岭回归、XGBoost分析Airbnb房屋数据:旅游市场差异、价格预测|数据分享...

全文链接&#xff1a;https://tecdat.cn/?p37839 分析师&#xff1a;Kefan Yu 在大众旅游蓬勃发展的背景下&#xff0c;乡村旅游已成为推动乡村经济、社会和文化发展的关键力量。当前&#xff0c;乡村旅游接待设施主要以招待所、小宾馆和农家乐等形式存在。然而&#xff0c;一…

二叉树改良版——AVL树

为什么说是“改良”&#xff0c;其实标题的二叉树指的是搜索二叉树&#xff0c;它虽然可以缩短查找的效率&#xff0c;但如果数据已经有序或接近有序的话二叉树就会退化成单支树&#xff0c;这样查找元素的话反而会效率低下。因此&#xff0c;为了解决这个问题&#xff0c;AVL树…

zynq 添加lwip库

在自己的项目属性中. 就是在上一行的下面加了一行配置. 多了个 -llwip4 -Wl,--start-group,-lxil,-llwip4,-lgcc,-lc,--end-group

第十四届单片机嵌入式蓝桥杯

一、CubeMx配置 &#xff08;1&#xff09;LED配置 &#xff08;1&#xff09;LED灯里面用到了SN74HC573ADWR锁存器&#xff0c;这个锁存器有一个LE引脚,这个是我们芯片的锁存引脚&#xff08;使能引脚&#xff09;&#xff0c;由PD2这个端口来控制的 &#xff08;2&#xff…

Qt初识_通过代码创建hello world

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Qt初识_通过代码创建hello world 收录于专栏【Qt开发】 本专栏旨在分享学习Qt的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1.通过按…

魔珐出席INSIGHT金融洞察力峰会,共探AI内容生成新范式

2024年9月27日&#xff0c;2024INSIGHT金融洞察力在北京举行&#xff0c;来自银行、保险、期货、证券、基金等行业的业界翘楚&#xff0c;共商行业热点议题&#xff0c;为金融行业增进互信、扩大合作搭建闭门平台&#xff0c;贡献价值与力量。 魔珐科技AIGC业务负责人杜子航&a…

XUbuntu安装OpenSSH远程连接服务器

目录 打开终端。更新你的包索引安装OpenSSH服务器。在终端中输入以下命令&#xff1a;安装完成后&#xff0c;OpenSSH服务器会自动启动。查看主机 IP测试连接打开 cmd 终端SSH 连接虚拟机确认连接输入连接密码发现问题修改用户&#xff0c;尝试连接 打开终端。 更新你的包索引 …

候机时间计算(数学小题目,练习时间字符串“解析”)

时间字符串的简单处理&#xff0c;可自行解析也可以调库。 (笔记模板由python脚本于2024年10月10日 18:06:42创建&#xff0c;本篇笔记适合有基本编程逻辑的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“…

MinIO 学习订阅服务

MinIO 的入门非常简单 — 只需几个简单的命令和一个 100 MB 的小二进制文件&#xff0c;您就可以立即启动并运行一个功能性开发环境。但是&#xff0c;为了在生产规模上利用 MinIO 的全部功能&#xff0c;我们鼓励专业人士更多地了解 MinIO 的广泛功能。我们推出了 MinIO 学习订…

Spring Boot课程问答:技术难题专家解答

摘要 随着信息互联网信息的飞速发展&#xff0c;无纸化作业变成了一种趋势&#xff0c;针对这个问题开发一个专门适应师生交流形式的网站。本文介绍了课程答疑系统的开发全过程。通过分析企业对于课程答疑系统的需求&#xff0c;创建了一个计算机管理课程答疑系统的方案。文章介…

企业远控私有化部署解决方案-内信互联

内信互联&#xff08;DoLink&#xff09;&#xff0c;是点量软件新推出的企业私有化远程控制系统解决方案。很多朋友对这个产品还不是很了解&#xff0c;今天点量小编就对其基础功能做一些详细说明&#xff0c;如果您想快速拥有自己的企业私有远程控制系统&#xff0c;欢迎联系…