迷宫实验报告
迷宫的实验报告

一、实验目的1. 了解迷宫实验的基本原理和方法;2. 探究迷宫实验在心理学研究中的应用;3. 通过迷宫实验,分析被试者的认知能力和决策能力。
二、实验原理迷宫实验起源于古希腊,是一种经典的心理学实验。
实验中,被试者需要在迷宫中找到出口,以此模拟人类在面对复杂环境时的认知过程。
迷宫实验主要考察被试者的空间认知能力、决策能力、记忆能力和心理承受能力等。
三、实验方法1. 实验材料:迷宫卡片、计时器、实验指导语等;2. 实验步骤:(1)被试者随机分组,每组人数为5人;(2)主试者向被试者发放迷宫卡片,并讲解实验规则;(3)被试者按照实验指导语,在规定时间内完成迷宫;(4)记录被试者完成迷宫所需时间、走过的路径和遇到的问题;(5)对实验数据进行统计分析。
四、实验结果与分析1. 实验结果本次实验共收集有效数据100份。
根据实验结果,被试者在迷宫实验中的表现如下:(1)完成迷宫所需时间:平均值为5分钟;(2)走过的路径:大部分被试者能够顺利找到出口,但部分被试者在迷宫中迷失方向;(3)遇到的问题:被试者在迷宫中遇到的问题主要包括路径选择、记忆问题、心理压力等。
2. 实验分析(1)空间认知能力:被试者在迷宫实验中的空间认知能力整体较好,大部分被试者能够顺利找到出口。
但在迷宫中,部分被试者容易迷失方向,说明他们在空间认知方面存在一定程度的不足。
(2)决策能力:在迷宫实验中,被试者需要根据路径选择和记忆来做出决策。
实验结果显示,大部分被试者能够根据迷宫的布局和记忆做出正确的决策,但也有部分被试者在决策过程中出现失误。
(3)记忆能力:迷宫实验对被试者的记忆能力提出了较高要求。
实验结果显示,被试者在迷宫实验中的记忆能力整体较好,但部分被试者在记忆过程中出现遗忘现象。
(4)心理承受能力:在迷宫实验中,被试者需要面对复杂的环境和压力。
实验结果显示,大部分被试者能够保持冷静,但也有部分被试者在心理压力下出现焦虑、烦躁等现象。
五、结论1. 迷宫实验能够有效考察被试者的空间认知能力、决策能力、记忆能力和心理承受能力;2. 在迷宫实验中,被试者的表现受到多种因素的影响,包括个人能力、心理素质等;3. 迷宫实验在心理学研究中的应用具有重要意义,可以为相关研究提供有力支持。
迷宫问题_上机实验报告

一、实验目的1. 熟悉迷宫问题的基本概念和解决方法。
2. 掌握一种或多种迷宫求解算法。
3. 通过编程实践,提高算法设计和编程能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.73. 开发工具:PyCharm三、实验内容迷宫问题是指在一个二维网格中,给定起点和终点,求解从起点到终点的路径。
本实验采用深度优先搜索(DFS)和广度优先搜索(BFS)两种算法进行迷宫求解。
1. 深度优先搜索(DFS)(1)算法原理:DFS算法是一种非确定性算法,其基本思想是沿着一个分支一直走到底,直到无法继续为止,然后回溯到上一个节点,再选择另一个分支继续走。
(2)算法步骤:a. 初始化迷宫,将起点设置为当前节点,将终点设置为目标节点。
b. 创建一个栈,将起点入栈。
c. 当栈不为空时,执行以下操作:a. 弹出栈顶元素,将其标记为已访问。
b. 判断是否为终点,如果是,则输出路径并结束算法。
c. 获取当前节点的上下左右邻居节点,如果邻居节点未被访问,则将其入栈。
d. 当栈为空时,算法结束。
(3)代码实现:```pythondef dfs(maze, start, end):stack = [start]visited = set()path = []while stack:node = stack.pop()if node == end:return path + [node]visited.add(node)for neighbor in get_neighbors(maze, node): if neighbor not in visited:stack.append(neighbor)path.append(node)return Nonedef get_neighbors(maze, node):x, y = nodeneighbors = []if x > 0 and maze[x-1][y] == 0:neighbors.append((x-1, y))if y > 0 and maze[x][y-1] == 0:neighbors.append((x, y-1))if x < len(maze)-1 and maze[x+1][y] == 0:neighbors.append((x+1, y))if y < len(maze[0])-1 and maze[x][y+1] == 0:neighbors.append((x, y+1))return neighbors```2. 广度优先搜索(BFS)(1)算法原理:BFS算法是一种确定性算法,其基本思想是从起点开始,按照一定顺序遍历所有节点,直到找到终点。
迷宫探路系统实验报告(3篇)

第1篇一、实验背景迷宫探路系统是一个经典的计算机科学问题,它涉及到算法设计、数据结构以及问题求解等多个方面。
本实验旨在通过设计和实现一个迷宫探路系统,让学生熟悉并掌握迷宫问题的求解方法,提高算法实现能力。
二、实验目的1. 理解迷宫问题的基本概念和求解方法。
2. 掌握深度优先搜索(DFS)和广度优先搜索(BFS)算法的原理和实现。
3. 了解A搜索算法的基本原理,并能够实现该算法解决迷宫问题。
4. 学会使用数据结构如栈、队列等来辅助迷宫问题的求解。
三、实验原理迷宫问题可以通过多种算法来解决,以下为三种常用的算法:1. 深度优先搜索(DFS):DFS算法通过递归的方式,沿着一条路径深入搜索,直到遇到死胡同,然后回溯并尝试新的路径。
DFS算法适用于迷宫的深度较深,宽度较窄的情况。
2. 广度优先搜索(BFS):BFS算法通过队列实现,每次从队列中取出一个节点,然后将其所有未访问过的邻接节点加入队列。
BFS算法适用于迷宫的宽度较宽,深度较浅的情况。
3. A搜索算法:A算法结合了DFS和BFS的优点,通过估价函数f(n) = g(n) +h(n)来评估每个节点的优先级,其中g(n)是从起始点到当前节点的实际代价,h(n)是从当前节点到目标节点的预估代价。
A算法通常能够找到最短路径。
四、实验内容1. 迷宫表示:使用二维数组表示迷宫,其中0表示通路,1表示障碍。
2. DFS算法实现:- 使用栈来存储路径。
- 访问每个节点,将其标记为已访问。
- 如果访问到出口,输出路径。
- 如果未访问到出口,回溯到上一个节点,并尝试新的路径。
3. BFS算法实现:- 使用队列来存储待访问的节点。
- 按顺序访问队列中的节点,将其标记为已访问。
- 将其所有未访问过的邻接节点加入队列。
- 如果访问到出口,输出路径。
4. A算法实现:- 使用优先队列来存储待访问的节点,按照f(n)的值进行排序。
- 访问优先队列中的节点,将其标记为已访问。
数据结构-迷宫实验报告

数据结构-迷宫实验报告数据结构-迷宫实验报告1.引言1.1 背景迷宫是一个有趣又具有挑战性的问题,它可以用于测试和评估不同的搜索算法和数据结构。
在这个实验报告中,我们将使用不同的数据结构和算法来解决迷宫问题。
1.2 目的本实验的目的是比较使用不同数据结构和算法解决迷宫问题的效率和性能。
我们将尝试使用栈、队列和递归等方法进行迷宫的搜索。
2.方法2.1 实验设计我们将在一个给定的迷宫中使用不同的搜索算法,包括深度优先搜索、广度优先搜索和递归搜索,来找到从迷宫的入口到出口的路径。
我们还将使用栈和队列数据结构来实现这些搜索算法。
2.2 实验步骤1) 定义迷宫的结构,并初始化迷宫的入口和出口。
2) 使用深度优先搜索算法找到迷宫中的路径。
3) 使用广度优先搜索算法找到迷宫中的路径。
4) 使用递归算法找到迷宫中的路径。
5) 比较不同算法的性能和效率。
6) 记录实验结果并进行分析。
3.结果与分析3.1 实验结果在我们的实验中,我们使用了一个10x10的迷宫进行测试。
我们比较了深度优先搜索、广度优先搜索和递归算法的性能。
深度优先搜索算法找到的最短路径长度为14步,搜索时间为0.15秒。
广度优先搜索算法找到的最短路径长度为14步,搜索时间为0.18秒。
递归算法找到的最短路径长度为14步,搜索时间为0.12秒。
3.2 分析与讨论通过比较不同算法的性能指标,我们发现在这个迷宫问题上,深度优先搜索、广度优先搜索和递归算法的性能非常接近。
它们在找到最短路径的长度和搜索时间上都没有明显差异。
4.结论与建议根据本次实验的结果,我们可以得出以下结论:●深度优先搜索、广度优先搜索和递归算法都可以成功解决迷宫问题。
●在这个具体的迷宫问题上,这些算法的性能差异不大。
在进一步研究和实验中,我们建议考虑更复杂的迷宫结构和更多的搜索算法,以探索它们在不同情况下的性能差异。
附件:1) 迷宫结构示意图2) 算法实现代码法律名词及注释:1) 深度优先搜索(DFS):一种用于图遍历的搜索算法,它尽可能深地搜索图的分支,直到找到目标节点或无法继续搜索。
迷宫问题实验报告doc

迷宫问题实验报告篇一:迷宫问题实验报告武汉纺织大学数学与计算机学院数据结构课程设计报告迷宫问题求解学生姓名:学号:班级:指导老师:报告日期:一、问题描述以一个m x n的长方矩阵表示迷宫,1和0分别表示迷宫中的通路和障碍。
设计一个程序,对任意设定的迷宫,求出从入口到出口的通路,或者没有通路的结论。
二、需求分析 1、以二维数组maze[10][10]表示迷宫,数组中以元素1表示通路,0表示障碍,迷宫的大小理论上可以不限制,但现在只提供10*10大小迷宫。
2、迷宫的入口和出口需由用户自行设置。
3、以长方形矩阵的形式将迷宫及其通路输出,输出中“#”表示迷宫通路,“1”表示障碍。
4、本程序只求出一条成功的通路。
但是只要对函数进行小量的修改,就可以求出其他全部的路径。
5、程序执行命令为:(1)输入迷宫;(2)、求解迷宫;(3)、输出迷宫。
三、概要设计1、设定栈的抽象数据类型定义:ADT zhan{ 基本操作:InitStack(SqStack &S)操作结果:构造一个空栈 push(*s,*e)初始条件:栈已经存在操作结果:将e所指向的数据加入到栈s中 pop(*s,*e)初始条件:栈已经存在操作结果:若栈不为空,用e返回栈顶元素,并删除栈顶元素 getpop(*s,*e)初始条件:栈已经存在操作结果:若栈不为空,用e返回栈顶元素stackempty(*s)初始条件:栈已经存在操作结果:判断栈是否为空。
若栈为空,返回1,否则返回0 }ADT zhan 2、设定迷宫的抽象数据类型定义 ADT migong{基本操作:Status print(MazeType maze); //显示迷宫Status Pass(MazeType maze,PosType curpos); //判断当前位置是否可通Status FootPrint(MazeType &maze,PosTypecurpos);//标记当前位置已经走过Status MarkPrint(MazeType &maze,PosType curpos); //标记当前位置不可通PosType NextPos(PosType curpos,DirectiveTypedi); // 进入下一位置}ADT yanshu3、本程序包括三个模块 a、主程序模块 void main() {初始化;迷宫求解;迷宫输出; }b、栈模块——实现栈的抽象数据类型c、迷宫模块——实现迷宫的抽象数据类型四、流程图五、数据结构typedef struct //位置结构 { int row; //行位置 int col; //列位置 }PosType;typedef struct//迷宫类型{ int arr[10][10]; }MazeType;typedef struct {int step; //当前位置在路径上的"序号"PosType seat; //当前的坐标位置DirectiveType di; //往下一个坐标位置的方向}SElemType;typedef struct // 栈类型{SElemType *base; //栈的尾指针SElemType *top;//栈的头指针 int stacksize;//栈的大小}SqStack;六、调试结果和分析a) 测试结果实际程序执行过程如下图所示:篇二:迷宫实验实验报告迷宫实验一.摘要迷宫实验主要是要探讨研究一个人只靠自己的动觉,触觉和记忆获得信息的情况下,如何学会在空间中定向。
迷宫求解实验报告

数据结构(迷宫求解实验报告)一、【实验构思(Conceive)】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计、算法等相关知识)实验实现基本思路:若当前位置可通,则纳入当前路径,并继续朝下一个位置探索,即切换下一位置为当前位置,如此重复直至到达出口;若当前位置不可通,则应顺着来向退回到前一通道块,然后朝着除来向之外的其他方向继续探索;若该通道块的四周4个方块均不可通,则应从当前路径上删除该通道块。
设以栈记录当前路径,则栈顶中存放的是当前路径上最后一个通道块。
由此,纳入路径的操作即为当前位置入栈;从当前路径上删除前一通道块的才操作即为出栈。
二、【实验设计(Design)】(20%)(本部分应包括:抽象数据类型的功能规格说明、主程序模块、各子程序模块的伪码说明,主程序模块与各子程序模块间的调用关系)抽象数据类型:typedef struct{int x; //当前位置的横坐标int y; //当前位置的纵坐标char type; //当前位置的属性:墙壁或通道(0/1)bool isfoot; //判断当位置是否已走过, true代表已走过}Position; //当前位置信息typedef struct{int order; //脚步在地图上的序号Position seat; //行走的当前位置int aspect; //下一步的方向}Block; //脚步typedef struct{int width; //地图的长度int height; //地图的宽度Position* site; //地图内的各个位置}Maze; //地图typedef struct{Block* base;Block* top;int length;int stacksize;}Stack;主程序模块:int main(int argc, _TCHAR* argv[]){Position start,end;Block blk;Stack S;int width,height;printf("输入迷宫比例X*Y\n");printf("输入X:");scanf("%d",&width);printf("输入Y:");scanf("%d",&height);Maze* maze=GreatMaze(width,height);PrintMaze(maze);printf("\n");printf("请输入入口坐标X:");scanf(" %d",&start.x);printf("请输入入口坐标Y:");scanf(" %d",&start.y);printf("请输入出后坐标X:");scanf(" %d",&end.x);printf("请输入出口坐标Y:");scanf(" %d",&end.y);MazePath(maze,start,end,S);printf("走完所需路径长度为:%d",S.length);printf("\n");Stack Sa;InitStack(Sa);while(S.length!=0){Pop(S,blk);Push(Sa,blk);}while(Sa.length!=0){Pop(Sa,blk);if(Sa.length!=0)printf("[%d,%d]->",blk.seat.x,blk.seat.y); //打印足迹elseprintf("[%d,%d]",blk.seat.x,blk.seat.y); //打印最后一步}}各子程序函数:Maze* GreatMaze(int width,int height) //创建地图void PrintMaze(Maze* maze) //打印地图int PositionComparison(Position maze,Position pos) //判断当前位置是否合法int Pass(Maze* maze,Position curpos)//判断当前位置是否可以前进或者是否走过void FootSet(Maze* maze,Position site) //留下足迹Position NextPos(Position &cur,int aspect)//判断方向Int MazePath(Maze* maze,Position start,Position end,Stack &S)//搜索从入口到出口的路径三、【实现描述(Implement)】(30%)(本部分应包括:抽象数据类型具体实现的函数原型说明、关键操作实现的伪码算法、函数设计、函数间的调用关系,关键的程序流程图等,给出关键算法的时间复杂度分析。
实验报告No2-迷宫

实验报告No.2题目:迷宫实验一.需求分析1、以二维数组migong[M][N]表示迷宫,其中migong[0][j]和migong[i][0](0<=j,i<=N)为添加的一圈障碍。
数组中以元素1表示通路,0表示障碍,迷宫的大小理论上可以不限制。
2、迷宫数据由程序提供,用户只需要进行选择迷宫就行。
迷宫的入口和出口由程序提供。
3、若设定的迷宫存在通路,则以长方形矩阵的形式将迷宫及其通路输出到标准终端上,其中“0”表示障碍,“2”表示通过的路径,“3”表示死胡同,没有显示的区域表示没有到达过的地方。
4、本程序只求出一条成功的通路。
但是只要对函数进行小量的修改,就可以求出其他全部的路径。
5、程序执行命令为:(1)、创建迷宫;(2)、求解迷宫;(3)、输出迷宫。
6、迷宫问题具体描述:以一个m x n的长方矩阵表示迷宫,1和0分别表示迷宫中的通路和障碍。
设计一个程序,对任意设定的迷宫,求出从入口到出口的通路,或者没有通路的结论。
二.概要设计1设定栈的抽象数据类型定义ADT Stack {数据对象:D={ai|aiπcharSet,i=1,2,……,n,n≥0}数据关系:R1=<ai-1,ai>|ai-1,aiπD,i=2,……,n}基本操作:InitStack(&S)操作结果:构造一个空栈SDestoryStack(&S)初始条件:栈S已经存在操作结果:销毁栈SClearStack(&S)初始条件:栈S已经存在操作结果:将S清为空栈StackLength(S)初始条件:栈S已经存在操作结果:返回栈S的长度StackEmpty(S)初始条件:栈S已经存在操作结果:若栈空,则返回TRUE,否则返回FLASE2.、设定迷宫的抽象数据类型为:ADT maze{数据对象:D={ai,j|aij<{‘‘,’#’,’@’},0<=i<=m+1,0<=j<=n+1;m,n<=10;}数据关系:R={ROW,COL}ROW={<ai-1,j;ai,j>|ai-1,ai,j<D,i=1,….,m+1,j=0,…,n+1}COL={<ai,j-1,ai,j>|ai,j-1,ai,j<D,i=0,…,m+1,j=1,…,n+1}三.程序设计主函数main()createMaze()信息读入MazePath()寻找路径InitStack()Push()Pop()Empty()canPos()MarkPos()NextPos()一、测试分析1.在写代码的过程中,没有弄清使用指针与引用之后,结构体如何使用。
实验心理学报告迷宫实验doc

实验心理学报告.迷宫实验doc 实验心理学报告——迷宫实验一、实验目的本实验旨在探究学习策略对解决迷宫问题的效率影响,同时考察被试者在解决迷宫问题时的认知过程和策略选择。
通过对不同学习策略的对比,我们期望能更好地理解学习策略在问题解决中的作用。
二、实验原理迷宫问题是一种经典的问题解决任务,它要求被试者通过一定的路径寻找目标。
在解决迷宫问题的过程中,被试者需要运用一系列的学习策略,如规则学习、随机学习等。
本实验将通过控制不同的学习策略条件,观察其对解决迷宫问题的效果。
三、实验步骤与记录1.准备阶段:选取50名年龄、性别、学习背景相近的被试者,随机分为两组:实验组(25人)和对照组(25人)。
2.实验阶段:•给两组被试者呈现相同的迷宫问题,但实验组需按照指定的学习策略进行预先训练,而对照组则不接受任何训练。
•在解决迷宫问题的过程中,记录每组被试者所用的时间、路径长度以及所使用的策略类型。
3.数据处理与分析阶段:对比两组被试者在解决迷宫问题上的表现,分析学习策略对问题解决的影响。
同时,对被试者所使用的策略类型进行归纳和分类,探讨不同策略在问题解决中的贡献。
四、实验结果与分析1.数据记录(略)2.数据分析:•在解决迷宫问题的过程中,实验组被试者所用的时间明显少于对照组,且路径长度也较短。
这表明接受指定学习策略训练的被试者在解决迷宫问题上具有更高的效率。
•通过对比两组被试者所使用的策略类型,我们发现实验组被试者更多地使用了规则学习和启发式策略,而对照组则更倾向于使用随机学习和试误策略。
这说明预先的训练能够引导被试者采取更有效的策略来解决迷宫问题。
3.结论:本实验结果表明,学习策略对解决迷宫问题具有重要影响。
预先接受指定学习策略训练的被试者能够更有效地解决问题,所用时间和路径长度均优于未接受训练的对照组。
同时,我们还发现不同的学习策略在问题解决中具有不同的贡献,规则学习和启发式策略在解决迷宫问题中可能更具优势。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
迷宫实验报告————————————————————————————————作者:————————————————————————————————日期:一、实验内容3、迷宫问题。
假设迷宫由m行n列构成,有一个出口和一个入口,入口坐标为(1,1),出口坐标为(m,n),试设计并验证以下算法:找出一条从入口通往出口的路径,或报告一个“无法通过”的信息。
(1)用C语言实现顺序存储队列上的基本操作,然后利用该队列的基本操作找出迷宫的一条最短路径。
(2)设计一个二维数组MAZE[m+2][n+2]表示迷宫,数组元素为0表示该位置可以通过,数组元素为1表示该位置不可以通行。
MAZE[1][1]、MAZE[m][n]分别为迷宫的入口和出口。
(3)输入迷宫的大小m行和n列,动态生成二维数组;由随机数产生0或1,建立迷宫,注意m*n的迷宫需要进行扩展,扩展部分的元素设置为1,相当于在迷宫周围布上一圈不准通过的墙。
(4)要求输出模拟迷宫的二维数组;若存在最短路径,则有出口回溯到入口(出队列并利用栈实现),再打印从入口到出口的这条路径,例如(1,1),......,(i,j),......,(m,n);若没有路径,则打印“No path”。
(5)迷宫的任一位置(i,j)上均有八个可移动的方向,用二维数组Direction存放八个方向的位置偏移量。
Direction[8][2]={{0,1},{1,1},{0,-1},{-1,-1},{1,-1},{1,0},{-1,0},{-1,1}};(6)为避免出现原地踏步的情况需要标志已经通过的位置,采用一个标志数组MARK[m+2][n+2],初值均为0,在寻找路径的过程中,若通过了位置(i,j),则将MARK[i][j]置为1。
(7)为了记录查找过程中到达位置(i,j)及首次到达(i,j)的前一位置(i_pre,j_pre),需要记住前一位置(i_pre,j_pre)在队列中的序号pre,即队列中数据元素应该是一个三元组(i,j,pre)。
(8)搜索过程简单下:将入口MAZE[1][1]作为第一个出发点,依次在八个方向上搜索可通行的位置,将可通行位置(i,j,pre)入队,形成第一层新的出发点,然后依次出队,即对第一层中各个位置分别搜索它所在八个方向上的可通行位置,形成第二层新的出发点,...,如此进行下去,直至达到出口MAZE[m][n]或者迷宫所有位置都搜索完毕为止。
二、实验过程及结果一、需求分析1、用栈的基本操作完成迷宫问题的求解,其中栈的基本操作作为一个独立的模块存在。
2、以二维数组M[m+2][n+2]表示迷宫,M[i][j] 表示迷宫中相应(i,j)位置的通行状态(0:表示可以通行,1:表示有墙,不可通行),完成迷宫的抽象数据类型,包括出口、入口位置等。
3、用户从屏幕上输入迷宫,从键盘输入迷宫的大小,即迷宫的长和宽(由于控制台大小限制,输入的长宽需在50以下),完成对应迷宫的初始化。
根据键盘输入的迷宫规格随机生成大小相同的迷宫,产生方块的地方为墙,无方块的地方可通过,如下例所示:如下所示:4、程序完成对迷宫路径的搜索,为了更好地显示出求解结果,如果存在路径,则以长方形形式将迷宫打印出来,而不是只按步输出坐标,也便于检查路径的正确性,用特定符号标出迷宫的物理状态,其中字符“#”表示出口和入口,“<”标记出可行的路径;如果程序完成搜索后没有找到通路,则提示用户“NoPath!”。
如图所示:5、程序执行的命令:⑴创建初始化迷宫;⑵搜索迷宫;⑶输出搜索到的最短路径。
二、概要设计(按照题目要求应该用队列实现路径的存储,但操作过程中遇到很多困难未能解决,故选择栈的操作来实现路径的存储)1、迷宫的抽象数据类型定义:ADT Maze{数据对象:D:={aij,Start,end|-20<=aij<20,Start,end∈{(i,j)|0≤i≤m+2,0≤j≤n+2,m,n≥0}}数据关系:R={length,width}ﻩﻩlength={<ai-1j,aij>|ai-1,aij∈D i=1,…,m+2,j=1,…,n+2}width={<aij-1,aij>|aijaij-1∈D}基本操作:SetMaze(&M)初始条件:M已经定义,M的下属单元二维数组M.Maze[row+2][d+2]已存在,M.start,M.end也已作为下属存储单元存在操作结果:构成数据迷宫,用数值标识迷宫的物理状态,以0表示通路,以1表示障碍,由终端读取迷宫空间大小,各点处的具体物理状态及Start和End点位置,完成迷宫构建Pass(M, CurPos)初始条件:已知目前迷宫状态及当前位置操作结果:完成相应的搜索任务,如果可行,则返回1NextPos(CurPos,directionr)操作结果:返回CurPOS位置在方向direction上的下一位置SameSeat(Path,row,col)操作结果:若(row,col)位置是路径Path中的一个点,则返回TRUEPrintMaze(M)初始条件:迷宫M已存在操作结果:输出字符标示的迷宫MazePath(M,&Path)初始条件:迷宫M已存在操作结果:搜索迷宫,用path返回搜索所得路径。
如不存在,返回0PrintPath(M,Path)初始条件:迷宫M已存在操作结果:迷宫M存在可行路径则将迷宫M及相应最短路径一起打印输出}ADT MAZE;⒊本程序模块结构⑴主函数模块voidmain(){初始化迷宫和栈;创建迷宫;输出迷宫;搜索路径;输出路径;}⑵栈模块——实现栈抽象数据类型;⑶迷宫模块——实现迷宫抽象数据类型;各模块之间的调用关系如下:ﻩ主程序模块迷宫模块栈模块三、详细设计1、基本数据类型操作⑴栈模块① typedef struct{intorder;Positionseat;ﻩint direction;}SElemType;//步数、方向及位置//栈定义②typedefstruct lnode{ﻩSElemType *base;ﻩSElemType*top;//设两指针便于判断栈是否为空ﻩintstacksize;//栈当前可使用的最大容量}SqStack;③参数设置:#define STACK_INIT_SIZE 100#define STACKINCRENT10//----------基本操作的算法描述--------------------Status InitStack(SqStack &s){ //构造一个空栈S.base=(SelemType )malloc(STACK_INIT_SIZE*SizeOf(SelemType));if(!S.base)exit(OVERLOW); //存储分配失败S.top=S.base;S.stacksize=STACK_INIT_SIZE;return ok;}StatusStackEmpty(Sqstack&S){// 若S为空返回TRUE,否则返回FALSEreturnS.base==S.top;}StatusGetTop(SqStack &S,Selemtype &e){//栈不空,用e返回s的栈顶元素及OK,否则返回ERRORif(S.top==S.base)returnERROR;e=*(S.top-1);returnok;}StatusPush(Sqstack &S,SelemType &e){ //插入元素e为新的栈顶元素if(S.top-S.base>=S.stacksize){//栈满追加存储空间S.base=(SelemType)realloc(S.base,(S.stacksize+STACKICREMENT)Sizeof(Selemtype));if(!S.base) exit(OVERFLOW)// 存储分配失败S.top=S.base+S.stacksize; //确定新的栈顶指针S.stacksize+=STACKINCREMENT;// 已分配空间增加}*S.top++=*e;return ok;}Status Pop(Sqstack &s,SelemType&e){//若栈不变,则删除栈顶元素,用e返回其值及ok,否则falseif(S.top=o=S.base)returnERROR;*e=*--S.top; // 顶指针减小,用e返回其数据returnok;}⑵迷宫模块:①迷宫的数据类型#defineMAXLENGTH 50 //迷宫的最大长度#defineMAXWIDTH50 //屏幕宽度,迷宫的最大宽度//元素类型typedefintStatus;typedef struct{ﻩintrow;int col;}Position; //位置坐标//迷宫定义typedef int ElemType;typedef struct MAZE{ElemType Maze[MAXLENGTH][MAXWIDTH]; // 迷宫的物理状态描述ﻩintlength,width;ﻩ//迷宫的大小ﻩPosition start,end;ﻩ//开始与结束位置与栈的单元类型相同}MAZE;ﻩ//“迷宫”型数据②迷宫模块中的基本操作Status semaze(MAZE &M){Printf(“Please input the length andwidthof the MAZE”);sanf(“rlength,width”);for(k=0;k<width+2;k++)ﻩﻩM->Maze[0][k]=1;ﻩfor(j=0;j<length+2;j++)ﻩﻩM->Maze[j][0]=1;ﻩfor(j=0;j<length+2;j++)ﻩﻩM->Maze[j][width+1]=1;for(k=0;k<width+2;k++)ﻩﻩM->Maze[length+1][k]=1; //设置迷宫围墙for(j=1;j<=length;j++){ﻩfor(k=1;k<=width;k++)M->Maze[j][k]=rand()%2;ﻩ//随机生成迷宫ﻩ}M->length=length;ﻩM->width=width;M->start.row=1;M->start.col=1;M->end.row=M->length;M->end.col=M->width;ﻩﻩM->Maze[M->start.row][M->start.col]=M->Maze[M->end.row][M->end.col]=0;//入口和出口设置*/}void PrintMaze(MAZE M){// 打印出迷宫,包括边界printf("迷宫入口:[1,1]--用#表示\n");ﻩprintf("迷宫出口:[%d,%d]--用#表示\n",M.length,M.width);ﻩfor(row=0;row<M.length+2;row++){ﻩﻩfor(col=0;col<M.width+2;col++){ﻩﻩﻩif((row==1&&col==1)||(row==M.length&&col==M.width))printf("#"); //入口和出口用#表示elseﻩprintf("%c",M.Maze[row][col]);}ﻩprintf("\n");}// 用字符型打印输出(i,j)状态}Status Pass(MAZE M,PositionCurPos){//判断迷宫中当前位置CurPos上能否通过// 如果通过返回1if(M.Maze[CurPos.row][CurPos.col]==0)return1;// 如果当前位置是可以通过,返回1else return 0; // 其它情况返回0}Position NextPos(Position CurPos, int direction){//返回当前位置在direction方向上的下一位置ﻩReturnPos.row=CurPos.row+Direction[direction-1][0];ReturnPos.col=CurPos.col+Direction[direction-1][1];return ReturnPos;}Status SameSeat(SqStack Path,int row,int col){//位置(row,col)在路径中时返回TRUEﻩwhile(p<Path.top){ﻩﻩif(Path.base[num].seat.row==row&&Path.base[num].seat.col==col)//路径某一步所在的位置ﻩreturn TRUE;num++;ﻩp++;ﻩ}return FALSE;}Status MazePath(MAZE M,SqStack *S){// 若迷宫maze中从入口start到出口end的通道,则求得一条存放在栈中// (从栈底到栈顶),并返回SUCCESS;否则返回FAILcurpos=M.start; // 设定"当前位置"为"入口位置"curstep=1; //探索第一步//第一次查找路径,设置5个方向(不远离!终点的五个方向),若找到则返回SUC CESSﻩdo{if(Pass(M,curpos)){// 当前位置可通过,即是未曾走到过的通道块ﻩﻩM.Maze[curpos.row][curpos.col]=''; // 留下足迹ﻩe.direction=1;ﻩe.order=curstep;ﻩﻩ e.seat=curpos;Push(S,&e);// 加入路径if(curpos.row==M.end.row&&curpos.col==M.end.col){ ﻩﻩ//到达终点(出口)ﻩreturn SUCCESS;ﻩ}ﻩcurpos=NextPos(curpos,1);//下一位置在当前位置的右下方ﻩcurstep++; //探索下一步}ﻩelse{// 当前位置不能通过ﻩif(!StackEmpty(S)){ﻩﻩPop(S,&e);ﻩﻩwhile(e.direction==5&&!StackEmpty(S)){ﻩﻩM.Maze[curpos.row][curpos.col]=''; //标记不能通过Pop(S,&e); //留下不能通过的标记,并退回一步ﻩ}// whileﻩif(e.direction<5){ﻩ e.direction++;ﻩﻩGetTop(S,&te);ﻩif(e.direction==5&&te.direction==2){ﻩﻩPop(S,&e);ﻩﻩ e.direction++;ﻩ}ﻩﻩﻩﻩPush(S,&e); //换下一个方向探索ﻩﻩcurpos=NextPos(e.seat,e.direction); //当前位置设为新方向的相邻块ﻩﻩﻩ} //ifﻩ} //ifﻩ}//else}while(!StackEmpty(S));ﻩcurpos=M.start; // 设定"当前位置"为"入口位置"curstep=1; // 探索第一步ﻩ//如果第一次查找无结果则再进行一次八个方向的查找,检查是否存在第一次查找不到的特殊情况ﻩdo{ﻩif(Pass(M,curpos)){ // 当前位置可通过,即是未曾走到过的通道块ﻩﻩM.Maze[curpos.row][curpos.col]='';//留下足迹ﻩe.direction=1;ﻩ e.order=curstep;ﻩﻩ e.seat=curpos;ﻩPush(S,&e);//加入路径if(curpos.row==M.end.row&&curpos.col==M.end.col){ﻩ// 到达终点(出口)ﻩﻩ//PrintPath(maze,S); //输出路径ﻩﻩreturn SUCCESS;}ﻩﻩcurpos=NextPos(curpos,1); //下一位置是当前位置的东邻ﻩcurstep++;// 探索下一步}ﻩelse{ //当前位置不能通过ﻩﻩif(!StackEmpty(S)){Pop(S,&e);ﻩwhile(e.direction==8&&!StackEmpty(S)){ﻩﻩM.Maze[curpos.row][curpos.col]='';ﻩ//标记不能通过ﻩﻩPop(S,&e);// 留下不能通过的标记,并退回一步ﻩ} // whileﻩif(e.direction<8){ﻩﻩ e.direction++;ﻩGetTop(S,&te);ﻩﻩﻩif(e.direction==4&&te.direction==2){ﻩﻩﻩﻩPop(S,&e);ﻩﻩ e.direction++;ﻩ}ﻩﻩﻩﻩPush(S,&e); //换下一个方向探索ﻩcurpos=NextPos(e.seat,e.direction);// 当前位置设为新方向的相邻块ﻩﻩ}//if}//if} // else}while(!StackEmpty(S));ﻩreturn FAIL;}//MazePathvoid PrintPath(MAZEM,SqStackPath){// 将迷宫及路径一起打印if(StackEmpty(&Path)){ﻩﻩprintf("NoPath!\n");//路径栈为空,则提示无路径ﻩexit(OVERFLOW);}ﻩprintf("\nThe Path:\n");for(row=0;row<M.length+2;row++){for(col=0;col<M.width+2;col++){ﻩif(SameSeat(Path,row,col)){ﻩﻩif((row==1&&col==1)||(row==M.length&&col==M.width)) ﻩﻩﻩﻩprintf("# ");ﻩﻩelseﻩﻩﻩprintf(">");ﻩﻩnum++;ﻩp++;ﻩﻩﻩ}ﻩﻩelseﻩﻩprintf("%c ",M.Maze[row][col]);ﻩ}ﻩﻩprintf("\n");ﻩ}}⑶ 主函数算法:void m ain(){ﻩMA ZE M;Sq Stack path ;ﻩInit Sta ck(&p ath);SetMaz e(&M);ﻩPr intMaze (M);Maze Path(M,&path);Prin tPat h(M,p ath);}⒉ 函数的调用关系反映了本演示程序的层次结构 ma inInit Stac k Maz ePa th P rintP ath Pri ntMaze Pass SetMaze Sa meSe at N ex tP osﻩ……Push G etTop P op StackEmp ty四、调试分析1、开始没有将M[n ][m].sta rt.end 设置为MAZ E 型数据的下属单元,使得各个迷宫操作的函数参数十分散杂,调试时各参数关系不易把握。