迷宫问题实验报告doc.docx
《迷宫问题实验报告doc.docx》由会员分享,可在线阅读,更多相关《迷宫问题实验报告doc.docx(10页珍藏版)》请在冰豆网上搜索。
![迷宫问题实验报告doc.docx](https://file1.bdocx.com/fileroot1/2023-4/17/fd09a065-9ed2-475c-b029-4b4716b93c26/fd09a065-9ed2-475c-b029-4b4716b93c261.gif)
迷宫问题实验报告doc
迷宫问题实验报告
篇一:
迷宫问题实验报告
武汉纺织大学数学与计算机学院
数据结构课程设计报告
迷宫问题求解
学生姓名:
学号:
班级:
指导老师:
报告日期:
一、问题描述
以一个mxn的长方矩阵表示迷宫,1和0分别表示迷宫中的通路和障碍。
设计一个程序,对任意设定的迷宫,求出从入口到出口的通路,或者没有通路的结论。
二、需求分析1、以二维数组maze[10][10]表示迷宫,数组中以元素1表示通路,0表示障碍,迷宫的大小理论上可以不限制,但现在只提供10*10大小迷宫。
2、迷宫的入口和出口需由用户自行设置。
3、以长方形矩阵的形式将迷宫及其通路输出,输出中“#”表示迷宫通路,“1”表示障碍。
4、本程序只求出一条成功的通路。
但是只要对函数进行小量的修改,就可以求出其他全部的路径。
5、程序执行命令为:
(1)输入迷宫;
(2)、求解迷宫;(3)、输出迷宫。
三、概要设计
1、设定栈的抽象数据类型定义:
ADTzhan{基本操作:
InitStack(SqStack&S)
操作结果:
构造一个空栈push(*s,*e)
初始条件:
栈已经存在
操作结果:
将e所指向的数据加入到栈s中pop(*s,*e)
初始条件:
栈已经存在
操作结果:
若栈不为空,用e返回栈顶元素,并删除栈顶元素getpop(*s,*e)
初始条件:
栈已经存在
操作结果:
若栈不为空,用e返回栈顶元素stackempty(*s)
初始条件:
栈已经存在
操作结果:
判断栈是否为空。
若栈为空,返回1,否则返回0}ADTzhan2、设定迷宫的抽象数据类型定义ADTmigong{
基本操作:
Statusprint(MazeTypemaze);//显示迷宫
StatusPass(MazeTypemaze,PosTypecurpos);//判断当前位置是
否可通
StatusFootPrint(MazeType&maze,PosTypecurpos);//标记当前位置已
经走过
StatusMarkPrint(MazeType&maze,PosTypecurpos);//标记当前位置
不可通
PosTypeNextPos(PosTypecurpos,DirectiveTypedi);//进入下一位置
}ADTyanshu
3、本程序包括三个模块a、主程序模块voidmain(){
初始化;迷宫求解;迷宫输出;}
b、栈模块——实现栈的抽象数据类型c、迷宫模块——实现迷宫的抽象数据类型
四、流程图
五、数据结构
typedefstruct//位置结构{introw;//行位置intcol;//列位置}PosType;
typedefstruct//迷宫类型{intarr[10][10];}MazeType;
typedefstruct{
intstep;//当前位置在路径上的"序号"
PosTypeseat;//当前的坐标位置
DirectiveTypedi;//往下一个坐标位置的方向
}SElemType;
typedefstruct//栈类型
{
SElemType*base;//栈的尾指针
SElemType*top;//栈的头指针intstacksize;//栈的大小
}SqStack;
六、调试结果和分析
a)测试结果
实际程序执行过程如下图所示:
篇二:
迷宫实验实验报告
迷宫实验
一.摘要
迷宫实验主要是要探讨研究一个人只靠自己的动觉,触觉和记忆获得信息的情况下,如何学会在空间中定向。
本实验的被试是华东师范大学应用心理学系大二的一名女同学,本实验以学习遍数为自变量,以所用时间和错误次数为因变量,让被试在排除视觉条件下,用小棒从迷宫起点凹槽移动到达终点,其间小棒每次进入盲巷并与盲巷末端金属片接触算一次错误,学会的定义为连续三遍不出错。
而且主试也不能给予被试任何提示或暗示。
被试要运用动觉,思维,记忆等自己认为有效的方法独立完成。
测试中为了控制疲劳带来的误差,若被试感到疲劳,可稍事休息再进行实验。
分析实验数据可知,被试走完迷宫所用时间成减少趋势,错误次数也成减少趋势。
在最初几次走迷宫时,错误次数会出现反复的时多时少的情况,所用时间也在反复,时多时少,这表明被试在摸索迷宫路线,处于对整个迷宫的整体定位中。
随着学习遍数的增加,错误次数与走完一次迷宫所用的时间开始减少,这表明被试对于迷宫的整体情况有了比较清楚的了解。
关键词迷宫学习次数学习时间错误次数
二.引言
人类从十九世纪末就开始研究迷宫学习了。
1899年,斯莫尔(W.S.Small)让白鼠学习一条相当复杂的迷津通路。
通过研究他认为,白鼠迷宫学习所依靠的主要是触觉和动觉记忆。
1912年希克思(V.C.Hicks)和卡尔把迷宫用于研究人类学习。
泊金斯(Perkins,1927)最早使用这种在手指迷宫的基础上发展起来的最简便、最常用的触棒迷宫(pencilmaze)。
近年来,学者们则利用迷宫进行逆反学习能力的研究。
而在特殊教育领域,也利用迷宫队正常人和盲人进行了触棒迷宫的对比试验,并得出了盲人心理的巨大补偿作用和学习潜能的结论。
迷宫是研究一个人只靠自己的动觉、触觉和记忆获得信息的情况下,如何学会在空间中定向。
迷宫的种类很多,结构方式也不一样,但是有一个特征,这就是有一条从起点到终点的正确途径与从此分出的若干条盲巷。
被试的任务是寻找与巩固掌握这条正确途径。
迷宫的学习一般可分为四个阶段:
1.一般方位辨认。
2.掌握迷宫的首段、尾段和中间的一、二部分。
3.扩大可掌握的部分,直至全部掌握空间图形。
4.形成集体对空间图形的自动化操作。
迷宫学习与被试的智商有关,它涉及被试的空间定向能力、思维、记忆诸多方面。
在此迷宫实验中,被试排除视觉条件,用小棒从迷宫起点沿凹槽移动到达终点。
在此过程中,被试要运用动觉,思维,记忆等自己认为有效的方法独立完成。
三.方法
被试:
华东师范大学心理学系,大二女生一名,19岁
仪器材料:
EPXX型心理试验台及EPT713型迷宫装置
实验过程:
1.完成实验前准备工作,接通电源、选择时间或次数显示,被试手捏铁笔,调节遮挡板,以使被试不能看到盲道。
2.实验指导语∶这是一个走迷宫的实验。
隔条间的槽是铁笔所走的路,其中有通路和不通路(盲道)两种,实验时我将引你,将笔尖放到起始位,你垂直地握着笔沿槽内行走,碰壁可向左或向右转弯,如无路可走表示为此路不通、亦会听到蜂鸣器响,这时你就得退出来,另换一条路走。
迷宫总有一条路是通的,沿着这条通路就可走到终点。
现要求你尽可能用最
短的时间、最少走进盲道的情况下,走完全过程。
直到三遍没进入盲道,才算学会。
注意整个实验过程不允许用手触摸迷宫板。
3.被试明确指导语后,主试手扶被试握铁笔手,将笔尖引入迷宫的起始位。
4.被试按指导语所述,进行实验,直至走到终点。
5.主试按T/N键记录实验成绩,再次将笔尖引入迷宫起始位,按复位键,---。
到三次未出错,实验结束。
6.主试查看并记录数据。
附:
若被试在学习过程内感到疲劳,可以在某次走到终点后休息几分钟。
四.结果
1.学习次数与所用时间
分析:
被试所用时间呈减少趋势。
这表明被试在不断学习的过程中对迷宫的整体路线有了越来越清楚的认识。
在刚开始实验的时候,时间变化范围较大,说明被试在摸索迷宫路线。
实验最后的几次学习中,所用时间相差不大,说明被试通过多次学习对迷宫的整体路线有了比较清楚而稳定的认识。
2.学习次数与错误次数
分析:
被试的错误次数成总体减少的趋势。
最初的几次学习中,错误次数相差较大,说明被试在摸索迷宫路线。
后来错误次数相差不大,说明被试通过多次学习已经对迷宫有了比较稳定而整体的认识。
五.讨论
1.本实验的自变量是什么?
为什么在实验前要对所用的自变量提出操作上的定义?
实验中的自变量是学习次数,因为,很多时候,实验者无法从实验目的直接得到合适的变量,因为直接的来的自变量往往不够明确,在实验中对它进行量化的操作是件难事。
如果不对它进行更明确的定义,那么不但这个实验本身难以进行,而且这个实验的结果与其他研究者的实验结果也难以比较,因为不同的研究者对变量的概念的理解可能是不同的。
解决这一问题的办法是采用明确,同意,可以量化的属于队自变量进行严格的规定,这就是对自变量下操作定义的过程。
操作定义明确了自变量的内涵,同时也往往只出了自变量操纵的方法。
2.本实验的因变量是什么?
它的作用是什么?
走完迷宫的时间和错误次数是因变量,因变量是随着自变量的变化而变化的,它可以反映其自身和自变量之间的关系,从而让实验结果更明显。
在此实验中,走完迷宫的时间和错误次数是用来反映学习效果的。
3.根据本实验的练习曲线,分析在排除视觉条件下动作技能形成的进程及趋势
在排除视觉条件的时候,动作技能的形成主要靠动觉,触觉和记忆,可以在一遍遍的犯错中找到正确的路线,通过对错误的地方的记忆,并运用联想和思维构建,来在脑海中创造一个迷宫的整体图像,通过触觉来记住贴在哪里走可以避免错误,进而慢慢减少错误直至没有错误。
在实验过程中,被试首先能掌握住迷宫首段和尾段的路线,以及中间的一两个部分的路线;随后掌握的部分慢慢变大,直至形成对整体路线的掌握。
所需要的时间和犯错误的次数都是呈现越来越少的趋势。
4.根据被试口头报告,分析其是依据什么线索完成练习的,总结迷宫学习的效果,方法被试报告是根据对错误的地方的记忆,如果没有碰到错误则记下是贴着那个边走的,对这些的记忆可以帮助被试在头脑中建造一条没有错误的路。
最开始不能把所有的路径都记清楚,但是随着练习次数的增加,便慢慢熟悉起来,最后达到轻车熟路,可以连续三次没有错误。
而且在实验过程中,经常会有自以为已经每个方向都尝试过可是都没有出路的不可能情况,这个时候经常就开始往回走,减少往回走的次数可以减少时间,这个时候不要慌乱,冷静再重新试过就会找到出去的路。
所以除了记忆等能力要求,心平气和不急躁的被试更易完成实验。
5.分析迷宫学习的个体差异和性别差异
个体的性格有很大差异,鉴于迷宫实验需要极大的耐心,不烦躁,才能获得比较好的效果。
所以,性格平和,有耐心的人的学习效果要好于急躁型的人。
女性通常比男性有耐心,长于记忆,所以,此实验中,女性的学习效果要优于男性。
六.参考文献
1,杨治良王新法心理实验指导手册。
华东师范大学心理学系XX,43~45
2,郭秀艳实验心理学。
人民教育出版社,XX,56~65
附录:
篇三:
C++迷宫问题实验报告
数据结构集中上机
试验报告
学院:
计算机科学与技术专业:
计算机科学与技术学号:
00000000班级:
(6)姓名:
XX0.10.27
题目:
编制一个求解迷宫通路的程序
以一个M*N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。
设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
实验要求:
实现一个以链表作存储结构的栈类型。
然后编写一个求解迷宫的非递归程序。
求得的通路以三元组(i,j,d)的形式输出,其中(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。
实验过程:
1.基本算法以及分析:
本程序主要是以链表构造栈的形式,寻找迷宫路径,根据创立的结点,输入结点里的一些数据,如下
structStack//构造栈
{
intMaze_x,Maze_y;//定义迷宫X,Y坐标
Stack*next;//定义栈指针
};
程序由主函数开始,首先,定义一个二维数组迷宫。
选择开始坐标点,然后,开始入栈,利用各个位置的判断循环建立结点,记录各个位置的数据,若走进死胡同则退栈,并且判断是否栈空,找到路径并到达出口后将栈倒置,使其按从入口到出口的顺序输出,之后调用迷宫图案输出
函数,使其按要求输出。
2.程序源代码:
迷宫问题
#include
#include
usingnamespacestd;
structStack//构造栈
{
intMaze_x,Maze_y,Maze_z;//定义迷宫X,Y坐标,z方向
Stack*next;//定义栈指针
};
Stack*ps;//链头指针
voidPop()//出栈函数
{
Stack*p;
p=ps;
ps=ps->next;
deletep;
}
voidpush(intx,inty,intz)//进栈函数
{
Stack*t;
t=newStack;
t->Maze_x=x;
t->Maze_y=y;
t->Maze_z=z;
t->next=ps;
ps=t;
}
voidMazepath(inta[][10],inti,intj)//迷宫路线寻找函数
{
a[i][j]=2;
intc,d,m=1;//定义变量c,d为出口坐标,变量m作为走过的步数
cout cin>>c>>d;
while(i!
=c||j!
=d)//判断是否到达出口
{
if(a[i][j+1]==0)//判断右边是否可行
{
push(i,j,1);
j++;
a[i][j]=2;//标记走过的位置
}
elseif(a[i+1][j]==0)
{
push(i,j,2);
i++;
a[i][j]=2;
}
elseif(a[i][j-1]==0)
{
push(i,j,3);
j--;
a[i][j]=2;
}
elseif(a[i-1][j]==0)
{
push(i,j,4);
i--;
a[i][j]=2;
}
else
{
inte1,e2;
Stack*p;
p=ps;
ps=ps->next;
e1=p->Maze_x;
e2=p->Maze_y;
a[e1][e2]=3;
deletep;
i=ps->Maze_x;
j=ps->Maze_y;
if(ps==NULL)//判断下边是否可行//标记走过的位置//判断左边是否可行//标记走过的位置//判断上边是否可行//标记走过的位置//四个方向都不可行,退栈//标记走过的死胡同坐标//删除栈顶元素//判断栈空否
出}{coutnext=NULL;while(ps!
=NULL)//倒置栈中的数据,使其从开始坐标输
{
Stack*t;
t=ps;
ps=ps->next;
t->next=pk->next;
pk->next=t;
}
Stack*k=pk;
pk=pk->next;
delete(k);//释放PK空间
while(pk!
=NULL)//输出走过的坐标
{
coutMaze_xMaze_yMaze_z Stack*k=pk;
pk=pk->next;
deletek;
}
cout cout }
voidPrintMaze(inta[][10])//迷宫图案输出函数
{
for(inti=0;i {
for(intj=0;j {
if(a[i][j]==1)
cout cout cout cout cout }
}
intmain()//主函数
{
intMaze[11][10]={{1,1,1,1,1,1,1,1,1,1},//二维数组直接定义迷宫,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,1,1},
{1,0,1,1,1,0,0,1,0,1},
{1,0,0,0,1,0,0,0,0,1},
{1,0,1,0,0,0,1,0,1,1},
{1,0,1,1,1,1,0,0,1,1},
{1,1,1,0,0,0,1,0,1,1},
{1,1,1,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1}};
cout cout inta,b;
cin>>a>>b;
Mazepath(Maze,a,b);
cout cout PrintMaze(Maze);
cout return1;
}
3.运行结果