迷宫实验报告

合集下载

迷宫的实验报告

迷宫的实验报告

一、实验目的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. A*算法:A*算法是一种启发式搜索算法,它综合了广度优先搜索和深度优先搜索的优点。

在实验中,我们将每个节点的代价定义为从起点到该节点的实际代价和从该节点到终点的预估代价之和。

A*算法通过优先选择代价最小的节点进行搜索,以期望找到一条最短路径。

实验结果表明,A*算法在大多数情况下能够找到最短路径,并且相对于广度优先搜索算法,它的搜索时间更短。

4. 遗传算法:除了传统的搜索算法外,我们还尝试了一种基于进化思想的遗传算法来解决迷宫问题。

遗传算法通过模拟生物进化过程中的选择、交叉和变异等操作来搜索最优解。

在实验中,我们将迷宫路径编码为一个个体,并使用适应度函数来评估每个个体的优劣。

经过多次迭代,遗传算法能够找到一条较优的路径,但是由于算法本身的复杂性,搜索时间较长。

迷宫问题_上机实验报告

迷宫问题_上机实验报告

一、实验目的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篇)

迷宫探路系统实验报告(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)的值进行排序。

- 访问优先队列中的节点,将其标记为已访问。

迷宫实验实验报告

迷宫实验实验报告

迷宫实验一.摘要迷宫实验主要是要探讨研究一个人只靠自己的动觉,触觉和记忆获得信息的情况下,如何学会在空间中定向。

本实验的被试是华东师范大学应用心理学系大二的一名女同学,本实验以学习遍数为自变量,以所用时间和错误次数为因变量,让被试在排除视觉条件下,用小棒从迷宫起点凹槽移动到达终点,其间小棒每次进入盲巷并与盲巷末端金属片接触算一次错误,学会的定义为连续三遍不出错。

而且主试也不能给予被试任何提示或暗示。

被试要运用动觉,思维,记忆等自己认为有效的方法独立完成。

测试中为了控制疲劳带来的误差,若被试感到疲劳,可稍事休息再进行实验。

分析实验数据可知,被试走完迷宫所用时间成减少趋势,错误次数也成减少趋势。

在最初几次走迷宫时,错误次数会出现反复的时多时少的情况,所用时间也在反复,时多时少,这表明被试在摸索迷宫路线,处于对整个迷宫的整体定位中。

随着学习遍数的增加,错误次数与走完一次迷宫所用的时间开始减少,这表明被试对于迷宫的整体情况有了比较清楚的了解。

关键词迷宫学习次数学习时间错误次数二.引言人类从十九世纪末就开始研究迷宫学习了。

1899 年,斯莫尔(W. S. Small ) 让白鼠学习一条相当复杂的迷津通路。

通过研究他认为,白鼠迷宫学习所依靠的主要是触觉和动觉记忆。

1912 年希克思(V. C. Hicks) 和卡尔把迷宫用于研究人类学习。

泊金斯(Perkins,1927)最早使用这种在手指迷宫的基础上发展起来的最简便、最常用的触棒迷宫(pencil maze)。

近年来,学者们则利用迷宫进行逆反学习能力的研究。

而在特殊教育领域,也利用迷宫队正常人和盲人进行了触棒迷宫的对比试验,并得出了盲人心理的巨大补偿作用和学习潜能的结论。

迷宫是研究一个人只靠自己的动觉、触觉和记忆获得信息的情况下,如何学会在空间中定向。

迷宫的种类很多,结构方式也不一样,但是有一个特征,这就是有一条从起点到终点的正确途径与从此分出的若干条盲巷。

迷宫问题实验报告doc

迷宫问题实验报告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) 测试结果实际程序执行过程如下图所示:篇二:迷宫实验实验报告迷宫实验一.摘要迷宫实验主要是要探讨研究一个人只靠自己的动觉,触觉和记忆获得信息的情况下,如何学会在空间中定向。

实验报告No2-迷宫

实验报告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

实验心理学报告.迷宫实验doc 实验心理学报告——迷宫实验一、实验目的本实验旨在探究学习策略对解决迷宫问题的效率影响,同时考察被试者在解决迷宫问题时的认知过程和策略选择。

通过对不同学习策略的对比,我们期望能更好地理解学习策略在问题解决中的作用。

二、实验原理迷宫问题是一种经典的问题解决任务,它要求被试者通过一定的路径寻找目标。

在解决迷宫问题的过程中,被试者需要运用一系列的学习策略,如规则学习、随机学习等。

本实验将通过控制不同的学习策略条件,观察其对解决迷宫问题的效果。

三、实验步骤与记录1.准备阶段:选取50名年龄、性别、学习背景相近的被试者,随机分为两组:实验组(25人)和对照组(25人)。

2.实验阶段:•给两组被试者呈现相同的迷宫问题,但实验组需按照指定的学习策略进行预先训练,而对照组则不接受任何训练。

•在解决迷宫问题的过程中,记录每组被试者所用的时间、路径长度以及所使用的策略类型。

3.数据处理与分析阶段:对比两组被试者在解决迷宫问题上的表现,分析学习策略对问题解决的影响。

同时,对被试者所使用的策略类型进行归纳和分类,探讨不同策略在问题解决中的贡献。

四、实验结果与分析1.数据记录(略)2.数据分析:•在解决迷宫问题的过程中,实验组被试者所用的时间明显少于对照组,且路径长度也较短。

这表明接受指定学习策略训练的被试者在解决迷宫问题上具有更高的效率。

•通过对比两组被试者所使用的策略类型,我们发现实验组被试者更多地使用了规则学习和启发式策略,而对照组则更倾向于使用随机学习和试误策略。

这说明预先的训练能够引导被试者采取更有效的策略来解决迷宫问题。

3.结论:本实验结果表明,学习策略对解决迷宫问题具有重要影响。

预先接受指定学习策略训练的被试者能够更有效地解决问题,所用时间和路径长度均优于未接受训练的对照组。

同时,我们还发现不同的学习策略在问题解决中具有不同的贡献,规则学习和启发式策略在解决迷宫问题中可能更具优势。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实习报告、题目:编制一个求解迷宫通路的程序班级:计算机04(2)姓名:王金锭学号:04120087完成日期:06.03.01一.需求分析:1.以二维数组Maze[m+2][n+2]表示迷宫,其中:Maze[0][j]和Maze[m+1][j](0<=j<=n+1)及Maze[i][0]Maze[i][n+1](0<=i<=m+1)为添加的一圈障碍.数组中以元素值为0表示通路,1表示障碍,限定迷宫的大小m,n<=10.2.用户以文件的形式输入迷宫的数据:文件中的第一行的数据为迷宫的行数m和列数n;从第二行至第m+1(每行n个数)为迷宫值,同一行中的两个数字之间用空白字符相隔。

3.迷宫的入口位置和出口位置可由用户随时设定。

4.若设定的迷宫存在通路,则以长方阵形式将迷宫及其通路输出到标准输出文件(即终端)上,其中,字符“#”表示障碍,字符“*”表示路径上的位置,字符“@”表示“死胡同”,即曾途径然而不能到达出口的位置,余者用空格符印出。

若设定的迷宫不存在通路,则报告相应信息。

5.本程序给出一条成功的通路,并且可以通过用户输入把所有的通路输出到指定的文件中。

6.测试数据见原题,当入口位置为(1,1),出口位置为(9,8)时,输出数据为:二.概要设计:1.设定栈的抽象数据类型定义:ADT Stack{数据对象:D={ai|ai∈IntSet,i=1,2….,n,n>=0}数据关系:{ai-1,ai|ai-1,ai∈D,i=1,2…..n}基本操作:InitStack(&S)操作结果:构造一个空栈。

DestroyStack(&S)初始条件:栈S已存在操作结果:将S清空为空栈。

ClearStack(&S)初始条件:栈S已存在。

操作结果:将S清为空栈。

StackLength(S)初始条件:栈S已存在。

操作结果:返回栈S的长度。

StackEmpty(S)初始条件:栈S已存在。

操作结果:若S为空栈,则返回TURE,否则返回FAULE。

GetTop(S,&e)初始条件:栈S已存在。

操作结果:若S不空,则以e返回栈顶元素。

Push(&S,e)初始条件:栈S存在。

操作结果:在栈S的栈顶插入新的栈顶元素e。

Pop(&S,e)初始条件:栈S已存在。

操作结果:删除S的栈顶元素,并以e返回其值。

StackTraverse(S,visit())初始条件:栈S已存在。

操作结果:从栈底到栈顶依次对S中的每个元素调用visit()。

}ADT Stack2. 求解迷宫中的一条通路的伪码算法 :设定当前位置的初值为入口位置;do{若当前位置可通,则{将当前位置插入栈顶;若该位置是出口位置,则结束;否则切换当前位置的东邻方块为新的当前位置;}否则{若栈不空且栈顶位置尚有其他方向未被搜索,则设定新的当前位置为沿顺时针方向旋转找到的栈顶苇子后的下一个相邻块;若栈不空但粘顶位置的四周均不可通,则{删去栈顶位置;若栈不空,则重新测试新的栈顶位置,直至找到一个可通的相邻块或出栈至空栈;}}}while(栈不空);{栈空说明没有路径存在}三.详细设计:typedef enum{Wall,Space,Thinked}TMazeElem;typedef struct{int x,y;}Coordinate;typedef struct {int iLength,iHeight;TMazeElem pMaze[MAX_MAZE_SIZE][MAX_MAZE_SIZE];Coordinate in,out;}TMaze;typedef struct{Coordinate pos;int di;}PathElem;void ClearMaze(TMaze *maze)//清空迷宫void PrintMaze(TMaze *maze)//输出迷宫bool SaveMaze(TMaze *maze,char *fname)//保存到文件fname迷宫bool LoadMaze(TMaze *maze,char *fname,char *errMsg)//从文件中输入迷宫void FindMazePath_B(TMaze *maze,char *fname)//用回溯法探索迷宫的所有解,并且把解写入文件名为fname 的文件3.主函数和其他函数的源代码int Number = 0;/*迷宫的解的个数*/typedef int bool;#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX_MAZE_SIZE 100#define MAX_STACK_SIZE 500extern int Number;typedef enum{Wall,Space,Thinked}TMazeElem;typedef struct{int x,y;}Coordinate;typedef struct {int iLength,iHeight;TMazeElem pMaze[MAX_MAZE_SIZE][MAX_MAZE_SIZE];Coordinate in,out;}TMaze;typedef struct{Coordinate pos;int di;}PathElem;void ClearMaze(TMaze *maze){/*清空迷宫*/int i ,j;for (i = 0; i < MAX_MAZE_SIZE; i++)for (j = 0; j < MAX_MAZE_SIZE; j++)maze->pMaze[i][j] = Wall;maze->iLength = 0;maze -> iHeight = 2;}/*clearmaze*/void PrintMaze(TMaze *maze){/*输出迷宫*/int x,y;for (x = 0; x < maze->iHeight; x++){printf("\n");for (y = 0; y < maze->iLength;y++){if (x == maze->in.x && y == maze->in.y){printf("e");continue;}if (x == maze->out.x && y == maze->out.y){printf("x");continue;}switch( maze->pMaze[x][y]){case Wall: printf("#");break;case Space: printf(" ");break;case Thinked: printf("*");break;}/*switch*/}/*for y*/}/*for x*/printf("\nin:(%d,%d)out:(%d,%d)\n",maze->in.x,maze->in.y,maze->out.x,maze->out.y);}/*PrintMaze*/bool SaveMaze(TMaze *maze,char *fname){/*保存到文件fname迷宫*/int x,y;FILE *fp;fp = fopen(fname,"a");if (fp == NULL){printf("\nCan't open or to creat!%s.",fname);return ERROR;}fputc('\n',fp);for (x = 0; x < maze->iHeight; x++){for (y = 0; y < maze->iLength;y++){if (x == maze->in.x && y == maze->in.y){fprintf(fp,"E");continue;}if (x == maze->out.x && y == maze->out.y){fprintf(fp,"X");continue;}switch( maze->pMaze[x][y]){case Wall: fprintf(fp,"1");break;case Space: fprintf(fp,"0");break;case Thinked: fprintf(fp,"2");break;}/*switch*/}/*for y*/fprintf(fp,"\n");}/*for x*/fprintf(fp,"\入口:(%d,%d) 出口:(%d,%d)",maze->in.x,maze->in.y,maze->out.x,maze->out.y);fclose(fp);}/*SaveMaze*/bool LoadMaze(TMaze *maze,char *fname,char *errMsg){/*从文件中输入迷宫*/FILE *fp;char ch;bool error = FALSE,begin = FALSE,end = FALSE,in = FALSE,out = FALSE;int x = 1,y = 1;ClearMaze(maze);maze->iLength = maze->iHeight = 2;fp = fopen(fname,"r");if ( fp == NULL ){strcpy(errMsg,"Can't open your maze txt!.");return ERROR;}while( !feof(fp) && error == FALSE && end == FALSE){ch = fgetc(fp);if ( ch == '[' && begin == FALSE){begin = TRUE;continue;}if (begin == FALSE) continue;if( y >= MAX_MAZE_SIZE || x >= MAX_MAZE_SIZE ) {error = TRUE;strcpy(errMsg,"Y our file is too large.");}switch(tolower(ch)){case '[': error = TRUE;strcpy(errMsg,"There is too much [");break;case ']': end = TRUE;maze->iHeight ++;break;case ',': maze->iHeight ++;x ++;if ( y > maze->iLength) maze->iLength = y;y = 1;break;case 'e': if (in == TRUE){error = TRUE;strcpy(errMsg,"There is too much entrance.");}else{in = TRUE;maze->pMaze[x][y] = Space;maze->in.x = x;maze->in.y = y++ ;}break;case 'x': if (out == TRUE){error = TRUE;strcpy(errMsg,"There is too much outpath.");}else {out = TRUE;maze->pMaze[x][y] = Space;maze->out.x = x;maze->out.y = y ++;}break;case '0': maze->pMaze[x][y++] = Space;break;case '1': y++;}/*switch*/}/*while*/if ( error == TRUE) return ERROR;if ( in == FALSE || out == FALSE){strcpy(errMsg,"There is no entrance or outpath.");return ERROR;}maze ->iLength += 1;return OK;}/*loadmaze*/static Coordinate Offset[] = {{1,0},/*左*/{0,1},/*下*/{-1,0},/*右*/{0,-1}/*上*/};void FindMazePath_B(TMaze *maze,char *fname){/*用回溯法探索迷宫的所有解,并且把解写入文件名为fname 的文件*/ PathElem pPath[MAX_STACK_SIZE];int iTop = 0;Coordinate cur;PathElem e;bool find;e.pos = maze->in;e.di = 0;pPath[iTop++] = e;maze->pMaze[e.pos.x][e.pos.y] = Thinked;cur.x = maze->in.x + Offset[0].x;cur.y = maze->in.y + Offset[0].y;while( iTop > 0){find = FALSE;if (cur.x == maze->out.x && cur.y == maze->out.y){Number++;printf("\n已经找到%d个解.",Number);find = TRUE;PrintMaze(maze);SaveMaze(maze,fname);}/*当前位置不可通或者已经找到了解,则回溯或者探索下一个没有探索的位置*/ if ((maze->pMaze[cur.x][cur.y]) != Space || find == TRUE){e = pPath[iTop - 1];while ( e.di >= 3 && iTop > 0){/*堆栈顶的位置的4个方向已经全部探索*/maze->pMaze[e.pos.x][e.pos.y] = Space;/*标记该位置为空*/iTop--;/*堆栈顶的元素出堆栈*/e = pPath[iTop - 1];cur = e.pos;}/*while*//*堆栈顶的位置的4个方向还有其他方向没有被探索*/pPath[iTop-1].di++;e = pPath[iTop - 1];cur.x = e.pos.x + Offset[e.di].x;/*确定当前位置为堆栈顶的下一个没有探索的位置*/cur.y = e.pos.y + Offset[e.di].y;continue;}/*if*//*当前位置可通*/e.pos = cur;e.di = 0;pPath[iTop++] = e;/*把当前位置压入堆栈*/maze->pMaze[e.pos.x][e.pos.y] = Thinked;cur.x = e.pos.x + Offset[0].x;/*确定当前位置为前位置的下一个位置*/cur.y = e.pos.y + Offset[0].y;}/*while*/printf(" \n 探索结束");}/*FindMazePath_B*/void main(void){TMaze myMaze;char errMsg[40],mazefile[100],outfile[100],dbgfile[100];char ch;FILE *fp = fopen("explore.txt","w");printf("\n 输入迷宫文件:");gets(mazefile);if(LoadMaze(&myMaze,mazefile,errMsg) == ERROR){printf("\n%s",errMsg);printf("\n按任意键退出....");return;}printf("\n\t\t你输入的迷宫");PrintMaze(&myMaze);printf("\n输入一个输出文件来保存所有结果:");gets(outfile);FindMazePath_B(&myMaze,outfile);fclose(fp);printf("\n一共探索到%d个解。

相关文档
最新文档