北邮数据结构实验二题目3迷宫问题

时间:2024.5.9

数据结构实验报告

实验名称: 实验二——题目3. 迷宫问题

学生姓名:

班    级:  

班内序号:

学    号:

日    期: 20##年11月25日

1.实验要求

利用栈结构实现迷宫求解问题。迷宫求解问题如下:

心理学家把一只老鼠从一个无顶盖的大盒子的入口赶进迷宫,迷宫中设置很多隔壁,对前进方向形成了多处障碍,心理学家在迷宫的唯一出口放置了一块奶酪,吸引老鼠在迷宫中寻找通路以到达出口,测试算法的迷宫如下图所示。

提示:

1、可以使用递归或非递归两种方法实现

    2、老鼠能够记住已经走过的路,不会反复走重复的路径

    3、可以自己任意设置迷宫的大小和障碍

    4、使用“穷举求解”的方法

2. 程序分析

2.1 存储结构

使用栈存储迷宫坐标

2.2 关键算法分析 

2.2.1关键算法

    寻找迷宫路径: 

    每走一步:

    1、如果当前位置=出口,结束

    2、否则:

        假设当前位置为路径;

        如果东面未走过:向东走一步

        如果南面未走过:向南走一步

        如果西面未走过:向西走一步

        如果北面未走过:向北走一步

        设置当前位置走不通,回溯

2.2.2代码详细分析

#include

using namespace std;

struct Point                                      //定义结构类型Point存储迷宫坐标

{

       int x,y;

};

template

class Stack                                          //定义模板类Stack实现顺序栈

{

    public:

              Stack(){top=-1;}                                 //构造函数

        void Push(T n){top++;data[top]=n;}                  //进栈

        T Pop(){top--;return data[top+1];}                   //出栈

       private:

              T data[100];                                  //定义数组data存储进栈数据

           int top;                                        //栈顶指针top

};

void MasePath(int arr[][10],Point start,Point end)             //函数MasePath寻找迷宫路径

{

       Stack PointStack;                            //栈PointStack

    Point P=start;                           //P记录当前迷宫坐标,首先记录入口坐标

    arr[P.x][P.y] = 2;             //-1——墙;0——路;1——错误路径;2——正确路径

       do{                                    /只要P的坐标不是出口坐标,进行此循环

              PointStack.Push(P);                             //将P记录的坐标存入存入栈

        if(arr[P.x][P.y+1]==0)    arr[P.x][++P.y]=2;    //如果P记录坐标的右左上下有路,P记录的坐标改为路的坐标,并假定是正确路径(记为2)

              else if(arr[P.x][P.y-1]==0)    arr[P.x][--P.y]=2;

              else if(arr[P.x+1][P.y]==0)    arr[++P.x][P.y]=2;

              else if(arr[P.x-1][P.y]==0)        arr[--P.x][P.y]=2;

        else                                       //如果P周围没有路了,将P所存坐标退出栈,该坐标记为1,P记录该坐标上一个坐标

        {

                     P=PointStack.Pop();

                     arr[P.x][P.y]=1;

                     P=PointStack.Pop();

              }

       }while ((P.x!=end.x) || (P.y!=end.y));

}

void PrintPath(int arr[][10])  //打印迷宫,墙为■,错误路径或未走路径为□,正确路径为*

{

       for (int i=0;i<10;i++)

       {

              for (int j=0;j<10;j++)

              {

                     if (arr[i][j]==-1) cout<<"■";

            else if (arr[i][j]==2) cout<<" *";

                     else cout<<"□";

              }

           cout<

       }

       cout<

}

void main()

{

int arr[10][10]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  //二维数组arr记录迷宫,-1表示墙,0表示路

                    -1,0,0,-1,0,0,0,-1,0,-1,

                   -1,0,0,-1,0,0,0,-1,0,-1,

                       -1,0,0,0,0,-1,-1,0,0,-1,

                       -1,0,-1,-1,-1,0,0,0,0,-1,

                       -1,0,0,0,-1,0,0,0,0,-1,

                       -1,0,-1,0,0,0,-1,0,0,-1,

                       -1,0,-1,-1,-1,0,-1,-1,0,-1,

                       -1,-1,0,0,0,0,0,0,0,0,

                       -1,-1,-1,-1,-1,-1,-1,-1,-1,-1};

       Point start,end;                        //start和end分别记录迷宫入口和出口坐标

    start.x=1;

       start.y=1;

       end.x=8;

       end.y=9;

    MasePath(arr,start,end);                               //寻找迷宫路径

    PrintPath(arr);                                       //打印迷宫

}

2.2.3时间复杂度

   O(1)

3.  程序运行结果

   运行结果:

  

     测试的迷宫为10*10,有至少一条正确路径;

4.  总结

 开始对题没有理解透,不知道怎么把解题方法用栈编写出来,于是开始一步一步确认:迷宫有横纵坐标,有“墙”有“路”,对应到编程语言就是用0,1等数字表示“墙”和“路”,用二维数组存储,刚好数组的下标可以表示迷宫坐标;由于计算机只能从一个点开始,朝四个方向挨个判断下一步是否走得通,走得通的点需要记录下其坐标,或许还可能走着走着突然发现路走不通了,需要再退回并删除已记录的部分坐标,于是自然想到用栈存储其坐标;而坐标有2个值,要存入顺序结构的栈需要先定义一个结构类型,表示坐标……到此为止,迷宫问题如何用程序语言编写已经清晰。

个人觉得一开始不知道怎么用栈是因为对栈和栈的运用不熟悉,同时也因为缺少编程的实战经验而缺少编程思想。今后需要认真理解所学知识,多看程序应用案例,同时自己也要多上手。

更多相关推荐:
数据结构-迷宫-实验报告与代码

一需求分析本程序是利用非递归的方法求出一条走出迷宫的路径并将路径输出首先由用户输入一组二维数组来组成迷宫确认后程序自动运行当迷宫有完整路径可以通过时以0和1所组成的迷宫形式输出标记所走过的路径结束程序当迷宫无路...

数据结构实验报告 迷宫

数据结构实验报告实验三迷宫姓名xxx学号xxx专业信息安全实验日期第十二三周周日实验三迷宫一实验目的1了解回溯法在求解迷宫问题中的应用2进一步掌握栈的使用二实验内容用回溯法求解迷宫问题可以用一个栈保存探索的序列...

数据结构实验报告——栈和队列(迷宫图最短路径)

数据结构实验报告书广东机电职业技术学院20##年5月目录一、实验要求(需求分析)...3a.实验目的...3b.实验内容...3c.程序功能...3二、程序分析...42.1存储结构...42.2关键算法分析.…

数据结构上机实验报告-迷宫求解

数据结构上机实验报告迷宫求解陈冠豪20xx2105010101015二O一O年5月26号实现代码ByLea20xx210501includeltstdiohgtincludeltstdlibhgt数据定义typ...

数据结构之迷宫求解实验报告武汉大学

数据结构实验报告迷宫求解问题实验上机环境DevC二程序设计相关信息1实验题目迷宫求解问题问题描述实验题35改进314节中的求解迷宫问题程序要求输出如图314所示的迷宫的所有路径并求最短路径长度及最短路径2实验项...

数据结构实验报告---迷宫问题--葛晨阳

数据结构课程设计设计题目迷宫问题学院信息技术学院专业网络工程班级B1204学号0913120xx9姓名葛晨阳指导老师戴玉洁课程设计日期20xx年7月20日20xx年8月日1实验题目一问题描述输入一个任意大小的迷...

数据结构(C语言版)实验报告(迷宫)

数据结构与算法实验报告评分依据及结果一需求分析1问题描述以一个mn的长方阵表示迷宫空格和感叹号分别表示迷宫中的通路和障碍设计一个程序对随机产生的迷宫求一条从入口到出口的通路或得出没有通路的结论2基本要求首先实现...

迷宫求解数据结构课程设计报告

数据结构课程设计题目学院专业班级学生姓名指导教师数据结构课程设计目录第一部分引言3第二部分课程设计报告3第一章课程设计目的3第二章课程设计内容和要求421问题描述422设计要求4第三章课程设计总体方案及分析43...

数据结构实验报告-迷宫漫游

实验四迷宫漫游一实验目的1234熟悉并掌握栈的使用熟悉并掌握函数递归的使用验证栈及其基本操作的实现进一步理解算法与程序的关系够将迷宫漫游算法转化为对应的程序二实验内容1实现小型迷宫的递归算法2实现小型迷宫的非递...

数据结构实验-迷宫问题

实验报告

《算法与数据结构》实验报告(20xx)内蒙古大学

内蒙古大学计算机学院amp软件学院算法与数据结构实验报告算法与数据结构实验报告班级姓名学号实验1线性表的应用6学时问题描述一个线性表A中包含有三类字符数字字符字母字符其他字符试写一个函数实现对线性表A的拆分使得...

迷宫求解数据结构课程设计报告

课程设计报告课题名称迷宫问题姓名学号专业班级指导教师目录第一部分课程设计报告3第一章课程设计目的3第二章课程设计内容和要求421问题描述422设计要求4第三章课程设计总体方案及分析431问题分析432概要设计7...

数据结构迷宫实验报告(24篇)