实验报告No2-迷宫

合集下载

迷宫实验报告

迷宫实验报告

迷宫实验报告迷宫实验报告引言:迷宫,作为一种古老而神秘的结构,一直以来都吸引着人们的好奇心。

在心理学领域,迷宫也被用作实验的工具,以探究人类的认知能力和行为模式。

本报告将介绍一项关于迷宫实验的研究,旨在揭示人类在解决迷宫问题时的思维方式和决策过程。

实验设计:实验采用了一座由墙壁和通道构成的迷宫结构。

迷宫的设计灵感来自于古埃及的金字塔,其复杂性和曲折性能够有效地引发参与者的困惑和挑战。

实验分为两个阶段,每个阶段都有一组参与者。

第一阶段:在第一阶段,参与者被要求在没有任何指引的情况下尽快从迷宫的入口找到出口。

他们的行走路径被记录下来,以便后续分析。

此阶段的目的是观察参与者在没有先验知识的情况下如何探索和解决迷宫问题。

第二阶段:在第二阶段,参与者被提供了一张简化的迷宫地图,其中标有入口、出口和一些关键的转折点。

他们被要求根据地图尽快找到出口。

同样,他们的行走路径被记录下来。

此阶段的目的是观察参与者在有先验知识的情况下是否能够更快地解决迷宫问题。

结果与分析:通过对参与者行走路径的分析,我们得出了一些有趣的结果。

在第一阶段中,参与者普遍表现出较为随机的行走路径,往往会反复试探不同的通道,直到找到正确的出口。

这种行为模式暗示了他们对迷宫结构的不熟悉和缺乏有效的导航策略。

然而,在第二阶段中,情况发生了变化。

参与者在获得地图后,往往能够更快地找到出口。

地图提供的关键信息帮助他们更好地规划路径,避免了盲目试探。

此外,我们还观察到参与者普遍会选择距离较短的路径,以节省时间和精力。

讨论与启示:这项实验揭示了人类在解决迷宫问题时的思维方式和决策过程。

在没有先验知识的情况下,人们往往会采取试错的策略,通过不断尝试不同的路径来找到正确的出口。

然而,一旦获得了相关信息,他们能够更快地解决问题,减少错误决策的可能性。

这一发现对于我们理解人类认知能力和决策行为具有重要意义。

在现实生活中,我们常常面临各种复杂的问题和抉择,而能够获得足够的信息和先验知识将有助于我们更好地解决这些问题。

迷宫的实验报告

迷宫的实验报告

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

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

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

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

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

迷宫实验报告

迷宫实验报告

实验报告一如何在排除视觉条件下学会空间定向1.引言空间定向是一种有机体在所处环境中正确辨识方向的知觉反应或是能力。

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

研究者们在20世纪初开始使用迷宫研究学习与记忆。

本实验的迷宫难度中等,被试要在排除视觉的情况下,学会走迷宫。

2.方法实验被试一名在校大二学生,男生,听觉正常,右利手。

实验仪器EPT713型迷宫装置实验设计本实验以学习遍数为自变量,以所用时间和错误次数为因变量,让被试闭上眼睛,用小棒从迷宫起点沿凹槽移动到终点,小棒进入迷宫盲巷并与巷末端金属片接触算一次错,直至连续三遍不出错,实验才结束。

实验程序被试进入实验室前,准备好迷宫仪器并且用挡板挡住仪器。

被试进来后做好准备则闭上眼睛,拿开挡板,主试读指导语,指导语为:这是一个迷宫实验,你要在排除视觉条件下,尽快学会走迷宫,中间不要停顿,要积极运用动觉、记忆和思维,期间若触棒进入盲巷并达到盲巷终点,仪器会发出蜂鸣声,并计错一次,到达终点、仪器会长鸣一秒。

当你三次无错走完迷宫,则实验结束。

被试手握触棒,主试把被试的触棒放在起点位置并同时告诉被试实验开始。

在实验过程中,主试不得有任何的提示,实验室环境要安静。

主试做好相关记录。

当连续走完三次迷宫后,被试疲劳,则让被试休息几分钟,休息期间,不得让被试看到迷宫,主试与被试也不得讨论迷宫。

连续三次无错走完迷宫,实验结束,主试询问被试做迷宫实验的感受。

3.结果把所得实验数据输入SPSS 13.0中,作出所用时间、错误次数与学习遍数的折线图,如下图(1)、(2)所需时间和错误次数随学习遍数的增加相对呈递减的趋势,学会后就相对平稳了。

图(1)图(2)4.讨论本实验的自变量是学习遍数,因变量是所用时间和错误次数。

实验结束的操作定义是连续三次准确无误地走完迷宫。

第一次学习时,被试所用时间很长,错误次数也很多,期间被试错误的路径走了很多次,被试在学习时口头报告知道错的在哪里,但是还是没有找到另一个正确的方向,被试多次停住思考了一段时间。

数据结构-迷宫实验报告

数据结构-迷宫实验报告

数据结构-迷宫实验报告数据结构-迷宫实验报告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

迷宫问题实验报告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-迷宫

实验报告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.在写代码的过程中,没有弄清使用指针与引用之后,结构体如何使用。

迷宫实验

迷宫实验

《迷宫》实验报告实验名称迷宫引言用迷宫(迷津)研究学习始于20世纪初。

迷宫的种类很多,结构方式也不一样(本迷宫难度中等),但它们都有一条从起点到终点的正确途径与从此分出的若干盲巷。

迷宫的学习一般可分为四个阶段:(1)一般的方位辨认;(2)掌握迷宫的首段、尾段和中间的一两个部分;(3)扩大可掌握的部分,直至全部掌握空间图形;(4)形成机体对空间图形的自动化操作。

被试的任务是寻找与巩固掌握这条正确途径。

迷宫的学习与被试的智商有关,它涉及被试的空间定向能力、思维、记忆等诸多方面。

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

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

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

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

Tolman在1948年提出“认知地图”的概念,用于解释动物完成迷宫任务的成绩。

他认为“在大鼠的脑中建立了某种类似于环境地图的东西”,使得它们重组获得的空间信息以建立关于环境的认知表征。

虽然“认知地图说”还是一个假说,但我们也可以尝试从这个角度来看人类的迷宫学习进程。

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

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

在此迷宫实验中,被试需要排除视觉条件,用小棒从迷宫起点沿凹槽移动到达终点,记录被试所花的时间和错误次数,并且重复进行实验。

本实验做出如下假设:(1)随着实验次数的增加,被试每次实验所花费的时间逐渐减少(2)随着实验次数的增加,被试的错误次数呈减少趋势。

实验方法1、将主机与附机EPT713迷宫装置连接好,打开电源,按<运行/待机>键,调节遮挡板,以使被试不能看到盲道。

迷宫实验报告

迷宫实验报告

迷宫实验摘要:迷宫实验是研究一个人靠自己的动觉、触觉和记忆获得信息的情况下,如何学会在空间中定向并研究技能形成过程。

本迷宫难度为中等,从起点到终点的正确途径与从此路径分出的若干条盲巷,被试的任务是寻找和巩固直至最后掌握这条正确途径。

本次实验的被试是12150201班的43名同学,以学习遍数为自变量,学习时间和错误次数为因变量,结果发现:学习遍数与学习时间、错误次数呈负相关,并制作了学习曲线图。

关键词:迷宫实验、学习遍数、学习时间、错误次数、学习曲线1 前言(引言)迷宫学习是研究动作学习的常用方法。

迷宫是学习在空间中定向的一种实验仪器。

有身体迷宫、触棒迷宫、手指迷宫等多种。

迷宫中的路线包括通路、转折、支路和盲巷。

从起点到终点通常只有一条路,要求被试在看不到迷宫的前提下以最快速度和最少错误到达终点。

学会的标准可以定为一遍内不发生错误(即没有进一次盲巷),或连续三遍不发生错误。

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

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

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

泊金斯(Perkins,1927)最早使用这种手指迷宫的基础上发展起来的最简单、最常用的触棒迷宫,对它的学习一般可分为四个阶段:1、方位辨认。

2、掌握迷宫的首段,尾端和中间的一两个部分。

3、扩大可掌握的部分,直至掌握全部空间图形。

4、形成集体对空间图形的自动化操作。

学习效果以每遍内错误(走入盲巷)的次数,或走一遍所用的时间为指标。

盲人由于心理补偿作用,动觉和触觉比常人敏感,所以他们的迷宫学习成绩要优于正常人[2]。

学习曲线是用图解表示学习进程的方法,它能够形象地反映学习的进程,一般都是用学习遍数作横坐标,用学习时间和错误次数做纵坐标绘制而成的。

[1]本实验考察被试学习触棒迷宫的学习进程,1. 随着学习遍数的增加,每遍的错误次数在不断减少,集体的错误学习曲线是下降的。

迷宫 实验报告

迷宫 实验报告

实验报告——迷宫实验实验目的:1、测定睁眼闭眼时学习效果的不同。

2、学习效果随实验次数的变化规律。

1. 实验设计(必须)本实验测量被试迷宫学习的学习曲线,学会的标准是连续三次不发生错误(即没有一次进入盲巷)走出迷宫,学习的效果用每遍内错误(走入盲巷)的次数和走一遍所用的时间为指标,并记录学会迷宫总共用的学习遍数。

1.1 变量控制(可选)(1) 实验仪器都是正常工作的,不存在差异性。

(2) 实验进行的外部条件(包括温度、亮度等)都是适宜的,假定其保持不变。

(3) 在实验进行前,已详细地向其解释实验操作过程,并事先熟悉、练习一遍,以排除熟悉度对于动作稳定实验的影响。

1.2 对照设置(可选)A.测定睁眼闭眼时学习效果的差异理论上控制其它的各种因素,将睁眼、闭眼作为实验中的唯一自变量,以准确反映其对因变量(所用时间和出错次数)的影响。

B.测定学习次数的增加对于学习效果的影响让一名被试连续做多次实验,记录每次实验所用的时间以及出错的次数,分析实验次数的增加是否对学习效果产生影响。

2. 实验过程(必须)(1)将随机附件电源变换器输出插头插入仪器的电源伸入端,然后将电源变换器插入交流220V供电电网的插座(2)合上仪器的电源开关,仪器数字显示0000.00的计时状态,使用者可按动N/T按钮选择仪器数字显示计时状态(0000.00)或计数状态(000)(3)拉出小抽板,拿出试笔,被试者手握试笔,试笔尽量和迷宫平面保持垂直,开始实验前,被试者作为第一次学习,应仔细观察迷宫的走道和盲道(4)开始实验,将试笔在迷宫内滑动,计时器开始计时,如试笔进入盲道并到短点,计数器加1,当试笔到达终点时,仪器内的蜂鸣器鸣响,计时计数器停止工作,按动N/T按钮,数字显示实验时间和出错次数(5)主试记录数据,被试取下眼罩(6)按仪器的RET按钮,仪器复位,数字显示0000.00(7)第二次实验,被试再一次观察迷宫的走道和盲道,作为第二次学习,然后按照第一次的步骤,再戴上眼罩,重复上一次实验(8)被试连续三次无错误地走完整个迷宫后,即可根据实验数据绘制出时间曲线和出错曲线3. 3. 实验结果(必须)3.1实验结果记录(必须)实验结果记录如下表所示:表2 睁眼时走完迷宫所需时间和错误次数随着学习次数的变化3.2 实验结果分析(必须)本实验的目的就是检验走完迷宫作用的时间和出错的次数是否随着实验次数的增加而减少。

迷宫游戏实验报告

迷宫游戏实验报告

一、实验背景迷宫游戏是一种古老而经典的智力游戏,其历史悠久,源远流长。

近年来,随着计算机技术的发展,迷宫游戏逐渐成为了一种新型的娱乐方式。

为了探究迷宫游戏在计算机编程中的应用,我们设计并实现了一个基于C++的迷宫游戏。

二、实验目的1. 掌握C++编程语言的基本语法和编程技巧;2. 了解迷宫问题的基本算法,并实现迷宫的生成、搜索和展示;3. 提高编程能力和逻辑思维能力;4. 分析迷宫游戏的设计与实现过程,总结经验教训。

三、实验内容1. 迷宫生成迷宫生成算法是迷宫游戏的关键技术之一。

本实验采用深度优先搜索算法生成迷宫。

深度优先搜索算法的基本思想是从起点开始,按照一定的顺序依次访问每个节点,直到访问完所有节点。

具体步骤如下:(1)初始化迷宫,设置起点和终点;(2)从起点开始,按照一定的顺序访问相邻节点;(3)将访问过的节点标记为已访问,并从其相邻节点中随机选择一个未访问节点进行访问;(4)重复步骤(2)和(3),直到访问完所有节点。

2. 迷宫搜索迷宫搜索算法是迷宫游戏中的另一个关键技术。

本实验采用广度优先搜索算法搜索迷宫路径。

广度优先搜索算法的基本思想是从起点开始,按照一定的顺序依次访问每个节点,直到找到目标节点。

具体步骤如下:(1)初始化搜索队列,将起点入队;(2)从队列中取出一个节点,访问其相邻节点;(3)将访问过的节点标记为已访问,并将其入队;(4)重复步骤(2)和(3),直到找到目标节点。

3. 迷宫展示迷宫展示是迷宫游戏的重要组成部分。

本实验采用图形化界面展示迷宫,包括迷宫地图、老鼠形象、粮仓位置等。

具体实现方法如下:(1)使用C++的图形库(如SDL)创建窗口和绘制迷宫地图;(2)使用图片资源显示老鼠形象和粮仓位置;(3)根据老鼠的移动实时更新迷宫地图。

4. 功能实现本实验实现以下功能:(1)编辑迷宫:允许用户修改迷宫,包括墙变路、路变墙;(2)闯关和计分:设置关卡,根据玩家在规定时间内完成迷宫的难度给予相应的分数;(3)找出所有路径和最短路径:在搜索过程中记录所有路径,并找出最短路径。

迷宫_实验报告

迷宫_实验报告

一、实验目的迷宫实验是一种经典的心理学实验,旨在研究人类在未知环境中的认知过程、决策策略以及空间记忆能力。

本实验旨在探讨以下问题:1. 个体在迷宫中的行为模式;2. 不同认知策略对迷宫探索的影响;3. 空间记忆能力在迷宫探索中的作用。

二、实验方法1. 实验对象:选取30名大学生作为实验对象,年龄在18-22岁之间,男女比例相当。

2. 实验材料:迷宫模型、计时器、记录表。

3. 实验程序:(1)实验前准备:将迷宫模型放置在实验室内,确保实验环境安静、光线充足。

(2)实验分组:将30名实验对象随机分为三组,每组10人,分别对应不同的认知策略。

(3)实验过程:①A组:采用随机探索策略,即随机选择一个方向前进,直到找到出口。

②B组:采用先探索后记忆策略,即先在迷宫中探索一段时间,然后将走过的路径和经验进行记忆,以便在后续的探索中避免重复。

③C组:采用空间记忆策略,即根据迷宫的空间结构,在脑海中构建迷宫的模型,以便在探索过程中进行有效的路径规划。

(4)实验记录:记录每位实验对象在迷宫中的探索时间、走过的路径长度以及是否成功找到出口。

三、实验结果与分析1. 实验结果通过实验数据的统计分析,得出以下结果:(1)A组平均探索时间为60秒,成功找到出口的比例为40%。

(2)B组平均探索时间为45秒,成功找到出口的比例为60%。

(3)C组平均探索时间为30秒,成功找到出口的比例为80%。

2. 实验结果分析(1)A组采用随机探索策略,由于缺乏有效的决策依据,导致探索时间较长,成功率较低。

(2)B组采用先探索后记忆策略,在探索过程中积累了一定的经验,成功找到出口的比例较高。

(3)C组采用空间记忆策略,通过构建迷宫模型,在探索过程中进行有效的路径规划,成功找到出口的比例最高。

四、实验结论1. 在迷宫实验中,不同认知策略对迷宫探索的影响显著。

随机探索策略效果较差,先探索后记忆策略和空间记忆策略效果较好。

2. 空间记忆能力在迷宫探索中起着至关重要的作用。

迷宫实验报告范文

迷宫实验报告范文

迷宫实验报告范文一、引言迷宫是一种通常用来测试动物的空间导航和记忆能力的实验装置。

通过在迷宫中设置目标和障碍物,可以观察实验对象在迷宫中的行为并分析其空间认知和学习能力。

本次实验旨在通过让小白鼠在迷宫中找到出口的过程中观察其行为,并尝试使用不同的训练方法来提升小白鼠的学习能力。

二、实验设计1.实验目标:观察小白鼠在迷宫中的行为并分析其学习能力。

2.实验材料:迷宫、小白鼠、计时器、观察记录表等。

3.实验步骤:a.将小白鼠放置在迷宫入口处,启动计时器并观察其行为。

b.记录小白鼠找到迷宫出口的时间和路线,并观察其行为表现。

c.根据观察记录分析小白鼠的行为特征和学习能力。

d.根据实验结果尝试使用不同的训练方法来提升小白鼠的学习能力,如增加奖励或惩罚等。

e.重复实验和训练步骤,直到观察到小白鼠学习能力的提升。

三、实验结果与分析在迷宫实验中,我们观察到小白鼠在开始实验时表现出迷茫和焦虑的行为,无法迅速找到迷宫出口。

随着实验的进行,小白鼠逐渐熟悉了迷宫的结构和布局,并开始寻找出口。

通过记录小白鼠的行为和计时,我们可以观察到小白鼠找到迷宫出口的时间逐渐缩短,表明其学习能力在实验过程中得到了提升。

在尝试不同的训练方法时,我们发现给予小白鼠奖励可以显著提高其学习能力。

当我们在迷宫出口设有奖励时,小白鼠往往能快速找到迷宫出口,并在短时间内完成实验任务。

这说明奖励的引导对小白鼠学习能力的提升具有积极的影响。

相反,当我们通过惩罚或者不给予奖励的方式进行训练时,小白鼠的学习能力没有得到有效改善,甚至出现了抵触和逃避的行为。

四、讨论与总结通过本次迷宫实验,我们观察到小白鼠在实验过程中的学习能力得到了提升,并且通过奖励的方式可以显著加速学习的过程。

这与动物学习行为的基本原理相一致,即通过奖励和惩罚等刺激来塑造和强化动物的学习行为。

然而,本次实验还存在一些问题。

首先,在实验设计上可以增加更多的训练条件和变量,以便更全面地观察小白鼠的学习能力和行为模式。

迷宫实验报告范文

迷宫实验报告范文

迷宫实验报告范文**迷宫实验报告****一、实验目的**1.理解迷宫问题的背景和相关概念;2.熟悉迷宫实验的规则和步骤,培养解决问题的能力;3.探究迷宫问题的求解方法及其效果。

**二、实验原理**1.迷宫问题:在一个固定的区域内,寻找从起点到终点的路径,期间避免碰到障碍物;2.深度优先算法(DFS):从起点出发,每次选择一个没有访问过的相邻节点继续深入,直到找到终点或者无路可走;3.广度优先算法(BFS):从起点出发,按照距离逐层,直到找到终点;4.A*算法:结合了启发函数和广度优先。

**三、实验步骤**1.首先,我们创建一个M*N的矩阵,用来表示迷宫。

其中,起点用"S"表示,终点用"E"表示,空格用"."表示,障碍物用"#"表示;2.然后,我们使用深度优先算法和广度优先算法分别求解迷宫问题;2.1深度优先算法(DFS):从起点出发,每次选择一个没有访问过的相邻节点继续深入,直到找到终点或者无路可走;2.2广度优先算法(BFS):从起点出发,按照距离逐层,直到找到终点;3.最后,我们使用A*算法求解迷宫问题。

A*算法结合了广度优先和启发函数,其中,启发函数用来估计每个节点到终点的距离。

**四、实验结果及分析**我们使用以上三种方法求解迷宫问题,并将结果进行比较:1.深度优先算法(DFS):该算法能够找到至少一条路径,但是并不能保证找到最短路径。

它倾向于选择一个方向一直走下去,直到无路可走,然后回溯到上一个节点继续探索。

这种算法在迷宫问题中很容易陷入局部最优解,但是效率较高。

2.广度优先算法(BFS):该算法可以保证找到最短路径,但是需要更长的时间和更大的空间。

它按照距离逐层,直到找到终点。

由于要保存每一层的节点,所以空间复杂度较高。

3.A*算法:该算法结合了广度优先和启发函数,能够找到最短路径,并且效率高。

启发函数用来估计每个节点到终点的距离,通过这个估计值,可以优先选择离终点更近的节点进行,从而提高效率。

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

实验报告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.在写代码的过程中,没有弄清使用指针与引用之后,结构体如何使用。

当使用指针的时候要使用‘.’,当使用引用或数的时候,要使用‘->’。

2.不会定义迷宫的抽象数据类型,最后看了书:typedef struct {int order ;/*当前位置在路径中的序号*/PosType seat;/* 当前位置在迷宫中的坐标*/Direction di; /*当前位置走到下一个位置的放方向*/}SElemType;/*栈元素的类型*/3.不知道如何表示一个迷宫的坐标:typedef struct PosType {int x;int y;}PosType;/*坐标*/4.在编辑围墙的时候,应该在行数与列数之后再加1,即是rows+1、cols+1。

5.文件读不进去,现在也不知道是因为什么。

五、源代码#include <stdlib.h>#include <stdio.h>#include <string.h>#define MAXSIZE 100#define ERROR -1#define OK 0#define FALSE 0#define TRUE 1#define OVERFLOW 2typedef enum{RIGHT,DOWN,LEFT,UP} Direction;typedef enum{YES,NO} MarkTag;typedef struct PosType {int x;int y;}PosType;/*坐标*/typedef struct {int order ;/*当前位置在路径中的序号*/PosType seat;/* 当前位置在迷宫中的坐标*/Direction di; /*当前位置走到下一个位置的放方向*/}SElemType;/*栈元素的类型*/typedef struct {SElemType *base;SElemType *top;int stacksize;}Stack;char maze[MAXSIZE+2][MAXSIZE+2];/*二维字符串数组表示迷宫*//*初始化一个栈*/int InitStack(Stack *S) {/*创建一个空栈*/S->base = (SElemType *)malloc(MAXSIZE*sizeof(SElemType));if(!S->base)exit(OVERFLOW);S->top=S->base;S->stacksize = MAXSIZE ;return OK;}/*入栈*/int Push (Stack *S,SElemType e) {/*元素e如栈*/if(S->stacksize >= MAXSIZE*MAXSIZE)return ERROR;S->top[S->stacksize++] = e;return OK;}/*出栈*/int Pop(Stack *S,SElemType e) {/*栈顶出栈,由e带回栈顶元素*/ if(S->stacksize <= 0) return ERROR;e = S->top[S->stacksize--] ;return OK;}/*判定为空*/int Empty(Stack S) {/*若栈为空,函数返回TRUE ,否则FALSE*/if(S.stacksize == 0) return TRUE;return OK;}/*创建迷宫*/int createMaze(char *filename,PosType *startpos,PosType *endpos) { /*从文件中读出迷宫所需要的信息*/FILE *fp;int i,j,rows,cols,temp;PosType start,end;fp = fopen(filename,"r");if(!fp) {printf("open file %s error!\n",filename);return ERROR;}if(!feof(fp)) {fscanf(fp,"%d%d",&rows,&cols);/*读入迷宫的行数和列数*/fscanf(fp,"%d%d",start.x,start.y);/*读入迷宫的入口位置*/fscanf(fp,"%d%d",end.x,end.y);/*读入迷宫的出口位置*/ }for(i = 1; i <= rows; i++) {for(j = 1 ; i <= cols;j++) {fscanf(fp,"%d",&temp);maze[i][j] =temp;}}fclose(fp);/*在四周加墙壁*/for(i = 0,j = 0;i <= rows+1;i++) maze[i][j] = '1';for(i = 0,j = cols+1;i <= rows+1;i++) maze[i][j] = '1';for(i = 0,j = 0;j <= cols+1;j++) maze[i][j] = '1';for(i = rows+1,j = 0;j <= cols+1;j++) maze[i][j] = '1';return OK;}int canPass(PosType curpos) {if(maze[curpos.x][curpos.y] == '0') return TRUE;return FALSE;}void markPos(PosType curpos,MarkTag tag) {/*为已经搜索过的位置添加标记*/ switch(tag) {case YES: maze[curpos.x][curpos.y] = '.';break;/*路径标记*/case NO: maze[curpos.x][curpos.y] = '#';break;/*死胡同`标记*/}}PosType nextPos(PosType curpos,Direction dir) {PosType nextpos;switch(dir) {case RIGHT : nextpos.x = curpos.x;nextpos.y = curpos.y+1;break;case DOWN : nextpos.x = curpos.x +1 ;nextpos.y = curpos.y;break;case LEFT : nextpos.x = curpos.x;nextpos.y = curpos.y-1;break;case UP : nextpos.x = curpos.x-1;nextpos.y = curpos.y;break;}}Direction nextDir(Direction dir) {switch(dir) {case RIGHT :return DOWN;case DOWN : return LEFT;case LEFT :UP;}}int MazePath(Stack *S,PosType start,PosType end) {/*若迷宫中存在从入口start到出口end的通道则求出一条放在栈中,并返回true*/ /*若迷宫中不存在从入口start到出口end的通道则求出一条放在栈中,并返回fale*/ PosType curpos;SElemType e;int curstep = 1;if(InitStack(S) == ERROR) return FALSE;curpos = start;do{if(canPass(curpos)) { /*this postion can pass*/markPos(curpos,YES);e.order = curstep;e.seat = curpos;e.di = RIGHT;Push(S,e);/*当前位置加入路径*/if(curpos.x == end.x && curpos.y == end.y) /*出口*/return TRUE;curpos = nextPos(curpos,RIGHT);curstep++;}else {/*can't pass this postion*/if(!Empty(*S)) {if(Pop(S,e) == ERROR) return FALSE;while(e.di == UP && !Empty(*S)) {/*四个方向都探索过没有路,不能继续探索,回溯*/curpos = e.seat;markPos(curpos,NO);if(Pop(S,e) == ERROR) return FALSE;}if(e.di != UP) {/*四个方向探索*/e.di = nextDir(e.di);Push(S,e);curpos = nextPos(e.seat,e.di);}}}}while(!Empty(*S));return FALSE;}int main() {PosType startPos,endPos;Stack path;SElemType e;char *fname="in.txt";if(createMaze(fname,&startPos,&endPos) == ERROR) return EXIT_FAILURE;MazePath(&path ,startPos,endPos);while(!Empty(path)) {/*输出入口路径*/Pop(&path,e);printf("(%d,%d)\n",e.seat.x,e.seat.y);}}。

相关文档
最新文档