迷宫问题c++实验报告

合集下载

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

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

《数据结构与算法》实验报告评分依据及结果一、需求分析1.问题描述:以一个m*n的长方阵表示迷宫,空格和感叹号分别表示迷宫中的通路和障碍。

设计一个程序,对随机产生的迷宫,求一条从入口到出口的通路,或得出没有通路的结论。

2.基本要求首先实现一个以链表为存储结构的栈类型,然后编写一个求解迷宫的非递归程序。

求得的通路以三元组(i,j,d)的形式输出。

其中(i,j)表示迷宫的一个坐标,d表示走到下一座标的方向。

3.程序的执行命令有:1)输入迷宫的列数2)输入迷宫的行数二、概要设计为实现上述功能,需要以一个链表为存储结构的栈类型1.栈的顺序存储表示typedef struct{int x; /*列*/int y; /*行*/}PosType; //坐标位置类型typedef struct{int ord; //通道块在路径上的"序号"PosType seat; //通道块在迷宫中的"坐标位置"int di; //从此通道块走向下一通道块的"方向"}SElemType; //栈的元素类型typedef struct{SElemType *base;SElemType *top;int stacksize; //当前已分配的存储空间,以元素为单位}SqStack;//迷宫程序typedef struct{int lie; /*列数*/int hang; /*行数*/char a[999][999];}MazeType; /*迷宫类型*/2.基本操作int InitStack(SqStack *S)//分配空间int GetTop(SqStack *S,SElemType *e) //若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERRORint Push(SqStack *S,SElemType *e)//插入元素e作为新的栈顶元素int Pop(SqStack *S,SElemType *e) //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERRORint generatemaze( MazeType *maze)// 随机生成迷宫int Pass(MazeType *maze, PosType curpos ) //判断当前位置可否通过int FootPrint(MazeType *maze,PosType curpos) //留下足迹int MarkPrint(MazeType *maze,PosType curpos) //留下不能通过的标记PosType NextPos(PosType curpos,int di) //返回当前位置的下一位置int MazePath(MazeType *maze,PosType start,PosType end) //若迷宫有解,则求得一条存放在栈中(从栈底到栈顶),并返回OK,否则返回ERROR void PrintMaze(MazeType *maze) //打印迷宫三、详细设计//程序的头文件#include <stdio.h>#include <malloc.h>#include <stdlib.h>#include <string.h>#include <time.h>//函数的返回值#define OK 1#define ERROR 0#define NULL 0#define OVERFLOW -2#define STACK_INIT_SIZE 100#define STACKINCREMENT 10//栈的顺序存储表示typedef struct{int x; /*列*/int y; /*行*/}PosType; //坐标位置类型typedef struct{int ord; //通道块在路径上的"序号"PosType seat; //通道块在迷宫中的"坐标位置"int di; //从此通道块走向下一通道块的"方向"}SElemType; //栈的元素类型typedef struct{SElemType *base;SElemType *top;int stacksize; //当前已分配的存储空间,以元素为单位}SqStack;//基本操作int InitStack(SqStack *S){S->base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));if(!S->base)exit(OVERFLOW);S->top=S->base;S->stacksize=STACK_INIT_SIZE;return OK;}//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERRORint GetTop(SqStack *S,SElemType *e){if(S->top==S->base)return ERROR;*e=*(S->top-1);return OK;}int Push(SqStack *S,SElemType *e)//插入元素e作为新的栈顶元素{if(S->top-S->base>=S->stacksize)/*栈满,追加存储空间*/{S->base=(SElemType*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(SElemType));if(!S->base)exit(OVERFLOW);S->top=S->base+S->stacksize;S->stacksize+=STACKINCREMENT;}*S->top++=*e;return OK;}//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERRORint Pop(SqStack *S,SElemType *e){if(S->top==S->base)return ERROR;*e=*--S->top;return OK;}int StackEmpty(SqStack *S){return(S->top==S->base);}//迷宫程序typedef struct{int lie; /*列数*/int hang; /*行数*/char a[999][999];}MazeType; /*迷宫类型*//*随机生成迷宫*/int generatemaze( MazeType *maze){int i,j;maze->a[0][0]=2;maze->a[++maze->hang][++maze->lie]=3; /*设置外墙*/maze->a[0][maze->lie]='!';maze->a[maze->hang][0]='!';for(j=1;j<maze->lie;j++){maze->a[0][j]='!';maze->a[maze->hang][j]='!';}for(i=1;i<maze->hang;i++){maze->a[i][0]='!';maze->a[i][maze->lie]='!';}srand((unsigned)time( NULL ));rand();for(i=1; i <maze->hang; i++)for(j=1;j<maze->lie;j++){if (rand()>=RAND_MAX/4) maze->a[i][j] =' '; //' ' 暗示出路else maze->a[i][j] ='!'; //'!'暗示无出路}return OK;}int Pass(MazeType *maze, PosType curpos ) //判断当前位置可否通过{if ((curpos.x < 1) || (curpos.x >= maze->lie))return ERROR;if ((curpos.y < 1) || (curpos.y >= maze->hang))return ERROR;if (maze->a[curpos.y][curpos.x]==' ')return OK;else return ERROR;}int FootPrint(MazeType *maze,PosType curpos) //留下足迹{maze->a[curpos.y][curpos.x]='*';return OK;}int MarkPrint(MazeType *maze,PosType curpos) //留下不能通过的标记{maze->a[curpos.y][curpos.x]='@';return OK;}PosType NextPos(PosType curpos,int di)//返回当前位置的下一位置{PosType pos=curpos;switch(di){case 1: //右东pos.x++;break;case 2: //下南pos.y++;break;case 3: //左西pos.x--;break;case 4: //上北pos.y--;break;}return pos;}//若迷宫有解,则求得一条存放在栈中(从栈底到栈顶),并返回OK,否则返回ERROR int MazePath(MazeType *maze,PosType start,PosType end){PosType curpos;SqStack *S=(SqStack *)malloc(sizeof(SqStack));InitStack(S);SElemType *e;e=(SElemType *)malloc(sizeof(SElemType));curpos=start; //设定当前位置为入口位置int curstep = 1; //探索第一步do {if(Pass(maze,curpos)) //当前位置可通过{FootPrint(maze,curpos);e->ord=curstep;e->seat=curpos;e->di=1;Push(S,e);if(curpos.x==end.x&&curpos.y==end.y)return (OK);curpos=NextPos(curpos,1);curstep++;}else{if(!StackEmpty(S)){Pop(S,e);while(e->di==4&&!StackEmpty(S)) //栈不空但栈顶位置四周均不通{MarkPrint(maze,e->seat);Pop(S,e);}if(e->di<4) //栈不空且栈顶位置四周有其他位置未探索{e->di++;Push(S,e);curpos=e->seat;curpos=NextPos(curpos,e->di);}}}}while(!StackEmpty(S));return ERROR;}void PrintMaze(MazeType *maze) //打印迷宫{int i,j,k,n;int c[999],d[999];for(i=0,k=0;i<=maze->hang;i++){for(j=0;j<=maze->lie;j++){printf("%c ",maze->a[i][j]);if(maze->a[i][j]=='*'){c[k]=i;d[k]=j;k++;}}printf("\n");}n=k;for(k=0;k<n;k++)printf("<%d,%d>",c[k],d[k]);printf("\n");printf("\n");}int main(){int zmg;char ch;printf(" 数据结构课程设计--迷宫问题求解\n\n");printf(" |----------------------------------------|\n");printf(" | |\n");printf(" | |\n");printf(" | |\n");printf(" | |\n");printf(" | XXXX XXXXXXXXXXXXXX |\n");printf(" | XXXXXXX |\n");printf(" |----------------------------------------|\n");getchar();do{system("cls");fflush(stdin);MazeType *maze=(MazeType *)malloc(sizeof(MazeType)); //设置迷宫的长宽不含外墙printf("请输入迷宫的列数(不含外墙时):");scanf("%d",&maze->lie);printf("请输入迷宫的行数(不含外墙时):");scanf("%d",&maze->hang);generatemaze(maze);printf("随机创建迷宫\n");PrintMaze(maze);getchar();getchar();PosType start,end;start.x=1;start.y=1;end.x=maze->lie-1;end.y=maze->hang-1;zmg=MazePath(maze,start,end);if(zmg){printf("此迷宫通路为\n");PrintMaze(maze);}elseprintf("此迷宫无通路\n"); //getchar();printf("再次尝试?(Y/N)?");scanf("%c",&ch);}while(ch=='Y'||ch=='y');return 0;}四、调试分析1.本程序界面设计合理,以空格为通路,感叹号!为障碍,笑脸为起始点,*为行走路线,心形为出口设计精巧,便于用户使用。

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

实验报告——迷宫问题

实验报告——迷宫问题
printf("\n");
}
}
//14.主函数
int main()
{
PosType begin,end;
int i,j,x,y,x1,y1;
printf("请输入迷宫行列数(包括外墙):(空格隔开)\n");
scanf("%d %d",&x,&y);
for(i=0;i<x;i++)//定义外墙
{
m[0][i]=0;
{
if(S.top-S.base>=S.stacksize)//栈顶-栈底>=栈长,说明空间已满
{
S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base)
exit(0);
[基本要求]
首先实现一个以顺序表或链表做存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。如:对下列数据的迷宫,输出的一条通路为:(1,1,1),(1,2,2),(2,2,2),…
[测试数据]
e.ord=curstep;
e.seat.x=curpos.x;
e.seat.y=curpos.y;
e.di=0;
Push(S,e);
curstep++;
if(curpos.x==end.x&&curpos.y==end.y)
return 1;
curpos=NextPos(curpos,e.di);

迷宫求解实验报告

迷宫求解实验报告

数据结构(迷宫求解实验报告)一、【实验构思(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%)(本部分应包括:抽象数据类型具体实现的函数原型说明、关键操作实现的伪码算法、函数设计、函数间的调用关系,关键的程序流程图等,给出关键算法的时间复杂度分析。

实验心理学报告迷宫实验doc

实验心理学报告迷宫实验doc

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

数据结构迷宫问题实验报告

数据结构迷宫问题实验报告

竭诚为您提供优质文档/双击可除数据结构迷宫问题实验报告篇一:数据结构-迷宫-实验报告与代码一.需求分析本程序是利用非递归的方法求出一条走出迷宫的路径,并将路径输出。

首先由用户输入一组二维数组来组成迷宫,确认后程序自动运行,当迷宫有完整路径可以通过时,以0和1所组成的迷宫形式输出,标记所走过的路径结束程序;当迷宫无路径时,提示输入错误结束程序。

程序执行的命令:1创建迷宫;2求解迷宫;3输出迷宫求解;二.算法设计本程序中采用的数据模型,用到的抽象数据类型的定义,程序的主要算法流程及各模块之间的层次调用关系程序基本结构:设定栈的抽象数据类型定义:ADTstack{数据对象:D={ai|ai∈charset,i=1,2,3,?..,n,n>=0;} 数据关系:R={|ai?1,ai∈D,i=2,?,n}设置迷宫的抽象类型ADTmaze{数据对象:D={ai|ai∈‘’,‘@’,‘#’,‘1’,i=1,2,?,n,n>=0}数据关系:R={r,c}r={|ai-1,ai∈D,i=1,2,?,n,}c=|ai-1,ai∈D,i=1,2,?,n,}结构体定义:typedefstruct//迷宫中x行y列的位置{intx;inty;}posType;typedefstruct//栈类型{intord;//通道块在路径上的“序号”posTypeseat;//通道块在迷宫中的“坐标位置”intdi;//从此通道块走向下一通道块的“方向”}mazeType;typedefstruct{mazeType*base;mazeType*top;intstacksize;}mazestack;基本函数:statusInitstack(mazestackif(!s.base)exit(oVeRFLow);s.top=s.base+s.stacksize;s.stacksize+=sTAcKIncRemenT;}*s.top++=e;returnoK;}2)出栈操作statuspop(mazestacke=*--s.top;returnoK;}3)判断栈是否为空statusstackempty(mazestackreturneRRoR;}4)迷宫路径求解statusmazepath(posTypestart,posTypeend)//迷宫路径求解{posTypecurpos;mazestacks;mazeTypee;intcurstep;Initstack(s);curpos=start;//设定当前位置为入口位置curstep=1;//探索第一步cout {if(pass(curpos))//当前位置可以通过,即是未曾走到的通道块{Footprint(curpos);//留下足迹e.ord=curstep;e.seat=curpos;e.di=1;push(s,e);//加入路径if(curpos.x==end.xreturnTRue;//到达终点(出口)}curpos=nextpos(curpos,e.di);//下一位置是当前位置的东邻++curstep;//探索下一步}else//当前位置不能通过{if(!stackempty(s)){pop(s,e);while(e.di==4//留下不能通过的标记pop(s,e);cout }if(e.di {++e.di;//换下一个方向探索篇二:数据结构试验报告-迷宫问题实验报告:迷宫问题题目:编写一个求解迷宫通路的程序一、需求分析:1)采用二维数组maze[m][n]来表示迷宫,其中:maze[0][j]和maze[m-1][j](0≤j≤n-1)及maze[i][0]和maze[i][n-1](0≤i≤m-1)为添加在迷宫外围的一圈障碍。

c++迷宫问题报告

c++迷宫问题报告

实习报告1.需求分析陈述选题任务,分析选题给出计算模型和设计方案,并:(1)确定设计程序接收的输入数据和输出数据的形式、取值范围;(2)初步列出测试数据以及测试目的;选题任务1)题目解决迷宫问题。

从入口A进入,出口B走出。

用动作标志:上、下、左、右,打印走出迷宫的过程。

并随机设计一个迷宫运行。

2)分析说明求迷宫中从入口到出口的所有路径是一个经典的程序设计问题。

由于计算机解迷宫时,通常用的“穷举求解”的方法,即从入口出发,顺某一方向向前探索,若能走通,则继续往前走;否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到为止。

为了保证在任何位置上都能沿原路退回,显然需要用一个后进先出的结构来保存从入口到当前位置的路径。

因此,在求迷宫通路的算法中应用“栈”。

(1)数据类型有整型、数组等。

(2)测试数据为原题给出迷宫形式,后为随机得到。

目的为了得到可以走出迷宫的路径。

2.程序设计说明程序中用到的所有数据类型的定义。

绘制主程序的流程图,以及各子程序模块间的调用关系;结束1.编程思路首先,先设定一个二维数组,用0表示通路,用1表示障碍,所求路径必须是简单路径,即在求得的路径上不能重复出现同一通道块。

其次,假设“当前位置”指的是在搜索过程中某一时刻所在图中某个方块位置“,则求迷宫中一条路径的算法的基本思想是:若当前位置“可通”,则纳入“当前路径”,并继续朝“下一位置”探索,即切换“下一位置”为“当前位置”,如此重复直至到达出口;若当前位置“不可通”,则应顺着“来向”退回到“前一通道块”,然后朝者“来向”之外的其他方向继续探索;若该通道块的四周四个方向均不可通,则应从当前路径上删除该通道块。

所谓下一位置指的是当前位置四周四个方向上相邻的方块。

假设以栈S记录当前路径,则栈顶中存放的是“当前路径上最后一个通道块”。

由此,纳入路径的操作即为当前位置入栈;从当前路径上删除前一通道块的操作即为出栈。

(1)以二维数组表示迷宫,其中设有障碍,数组中以元素值0表示通路,1表示障碍,限定迷宫的大小M,N〈=12,(2)用户以文件的形式输入迷宫的数据:文件中第一行的数据为迷宫的行数M和列数N;从第二行至第M+1行(每行N个数)为迷宫值,同一行中的两个数字之间用空白字符相隔。

c课程设计报告迷宫

c课程设计报告迷宫

c 课程设计报告迷宫一、教学目标本课程的教学目标是让学生掌握迷宫问题的基本概念、算法和编程技巧。

通过本课程的学习,学生应能理解迷宫问题的数学模型,掌握常用的迷宫算法,并能够运用编程语言实现迷宫的求解。

此外,学生还应培养解决问题的能力和创新思维,提高对计算机科学和编程的兴趣。

具体来说,知识目标包括:1.了解迷宫问题的背景和应用场景。

2.掌握迷宫问题的数学模型和基本概念。

3.熟悉常用的迷宫算法及其特点。

4.理解编程语言在解决迷宫问题中的应用。

技能目标包括:1.能够运用迷宫算法求解简单迷宫问题。

2.能够运用编程语言实现迷宫算法的求解。

3.能够对迷宫算法进行优化和改进。

情感态度价值观目标包括:1.培养学生对计算机科学和编程的兴趣。

2.培养学生解决问题的能力和创新思维。

3.培养学生的团队合作意识和沟通能力。

二、教学内容本课程的教学内容主要包括迷宫问题的基本概念、算法和编程技巧。

具体内容包括:1.迷宫问题的背景和应用场景。

2.迷宫问题的数学模型和基本概念。

3.常用的迷宫算法及其特点。

4.编程语言在解决迷宫问题中的应用。

教学大纲安排如下:第一课时:介绍迷宫问题的背景和应用场景,引入迷宫问题的数学模型和基本概念。

第二课时:介绍常用的迷宫算法及其特点,引导学生理解编程语言在解决迷宫问题中的应用。

第三课时:通过案例分析,让学生运用迷宫算法求解简单迷宫问题,培养学生的编程能力。

第四课时:引导学生对迷宫算法进行优化和改进,提高学生的解决问题的能力。

第五课时:进行课程总结和回顾,让学生展示自己的迷宫求解成果,进行交流和评价。

三、教学方法本课程的教学方法采用讲授法、讨论法和实验法相结合的方式。

通过讲授法,向学生传授迷宫问题的基本概念、算法和编程技巧;通过讨论法,引导学生进行思考和交流,培养学生的创新思维;通过实验法,让学生动手实践,培养学生的编程能力和解决问题的能力。

在教学过程中,教师应根据学生的实际情况,灵活运用不同的教学方法,以激发学生的学习兴趣和主动性。

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

数据结构实验报告班级:姓名:学号:组员:问题描述:迷宫实验是取自心理学的一个古典实验。

在该实验中,把一只老鼠从一个无顶大盒子的门放入,在盒中设置了许多墙,对行进方向形成了多处阻挡。

盒子仅有一个出口,在出口处放置一块奶酪,吸引老鼠在迷宫中寻找道路以到达出口。

对同一只老鼠重复进行上述实验,一直到老鼠从入口到出口,而不走错一步。

老鼠经多次试验终于得到它学习走迷宫的路线。

设计功能要求:迷宫由m行n列的二维数组设置,0表示无障碍,1表示有障碍。

设入口为(1,1),出口为(m,n),每次只能从一个无障碍单元移到周围四个方向上任一无障碍单元。

编程实现对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。

算法输入:代表迷宫入口的坐标算法输出:穿过迷宫的结果。

算法要点:创建迷宫,试探法查找路任务分派为了达到锻炼大家独立设计算法的能力,大家一致决定,先自己独立设计算法,不论算法的好坏、难易,完完全全出自于自己的手中。

在大家独立完成算法后,进行小组集中讨论,将自己的算法思想与大家交流,特别是自己最自豪的部分或是自己觉得可以改进的地方,之后得出最优结果。

独立设计求解思想:利用递归的方式进行求解。

从入口出发,按某一方向向前探索,若能走通(未走过的),即某处可以到达,则到达新点,否则试探下一方向;若所有的方向均没有通路,则沿原路返回前一点,换下一个方向再继续试探,直到所有可能的通路都探索到,或找到一条通路,或无路可走又返回到入口点。

如果现在位置(i,j)处于迷宫的边界位置,则有2种或3种可能的走法,为使问题简单化,用maze[m+2][n+2]来表示迷宫,而迷宫的四周的值全部为1,这样做使问题简单了,每个点的试探方向全部为4,不用再判断当前点的试探方向有几个,同时与迷宫周围是墙壁这一实际问题相一致。

struct Pos{int x,y;int di;};其中x、y分别表示横纵坐标值、di表示前进的方向。

在已经某一位置(i, j, d)的情况下,其下一个位置横、纵坐标的取值如表4-2所示。

而走到一个新位置时,其方向值初始置为1。

代码#include "iostream"#include "iomanip"using namespace std;struct Pos{int x,y;int di;};typedef Pos ElemType;struct StackNode{ElemType data;struct StackNode *next;};class LinkStack{private:StackNode *top;public:LinkStack();//无参构造函数~LinkStack();//析构函数void ClearStack();//将栈清空bool Push(ElemType x); //进栈bool Pop(ElemType &x);//出栈bool GetTop(ElemType &x);//取栈顶元素bool StackEmpty(); //判断栈是否为空栈int StackLength(); //栈的长度};LinkStack::LinkStack(){top=NULL;}LinkStack::~LinkStack(){StackNode *p;while(top!=NULL){p=top;top=top->next;delete p;}}bool LinkStack::StackEmpty(){if(!top)return true;return false;}int LinkStack::StackLength(){StackNode *p=top;int count=0;while(p){count++;p=p->next;}return count;}bool LinkStack::Push(ElemType x) {StackNode *p;p=new StackNode;p->data=x;p->next=top;top=p;return true;}bool LinkStack::Pop(ElemType& x) {if(StackEmpty())return false;else{StackNode *p=top;x=top->data;top=top->next;delete p;return true;}}bool LinkStack::GetTop(ElemType &x) {if(StackEmpty())return false;x=top->data;return true;}#define M 6+2#define N 6+2class Maze{int MazeArray[M][N];Pos start,end;public:Maze(int array[][N-2]);bool FindPath();void PrintPath();void SetStart(int x=1,int y=1);void SetEnd(int x=M-2,int y=N-2);Pos NextPos(Pos &curp);void Mark(Pos &curp);void DeadPos(Pos &curp);bool isEnd(Pos &curp);bool canPass(Pos &curp);void PrintMaze();};void Maze::Mark(Pos &curp){MazeArray[curp.x][curp.y]=-1;}bool Maze::canPass(Pos &curp){if(MazeArray[curp.x][curp.y]==0)return true;elsereturn false;}void Maze::DeadPos(Pos &curp){MazeArray[curp.x][curp.y]=2;}bool Maze::isEnd(Pos &curp){if(curp.x==end.x && curp.y==end.y) return true;return false;}void Maze::SetStart(int x,int y){start.x=x; start.y=y;}void Maze::SetEnd(int x,int y){end.x=x; end.y=y;}Maze::Maze(int array[][N-2]){//加围墙int i,j;for(i=0;i<M;i++){for(j=0;j<N;j++){if(i==0)MazeArray[i][j]=1;else if(j==0||j==N-1)MazeArray[i][j]=1;else if(i==M-1)MazeArray[i][j]=1;elseMazeArray[i][j]=array[i-1][j-1];}}cout<<"Initial Maze"<<endl;PrintMaze();}void Maze::PrintMaze(){for(int i=0;i<M;i++){for(int j=0;j<N;j++)cout<<setw(4)<<MazeArray[i][j];cout<<endl;}}Pos Maze::NextPos(Pos &curp){Pos nextp=curp;switch(curp.di){case 1:nextp.x++;break;//rightcase 2:nextp.y++;break;//downcase 3:nextp.x--;break;//leftcase 4:nextp.y--;break;//up}nextp.di=1;return nextp;}bool Maze::FindPath(){LinkStack S;Pos curp=start;do{if(canPass(curp)){Mark(curp);curp.di=1;S.Push(curp);if(isEnd(curp))return true;curp=NextPos(curp);}else{if(!S.StackEmpty()){S.Pop(curp);while(curp.di==4 && !S.StackEmpty()){DeadPos(curp);S.Pop(curp);}if(curp.di<4){curp.di++;S.Push(curp);curp=NextPos(curp);}}}}while(!S.StackEmpty());return false;}void main(){int array[M-2][N-2]={ {0, 1, 0, 0, 0, 0}, {0, 1, 0, 1, 1, 1},{0, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0},{0, 1, 0, 1, 0, 0}, {0, 1, 0, 1, 1, 0} };Maze M1(array);M1.SetStart();M1.SetEnd();if(M1.FindPath()){cout<<"Find the way."<<endl;M1.PrintMaze();}}个人总结一开始的想法有点偏简单,所以设计出来的算法比较冗长,不过算法在经过多次调试后可以基本实现算法的要求。

最大的不足:之后发现自己的算法实用性太低,迷宫的坐标给定,难以实现互动。

想通过小组讨论改进迷宫的生成部分。

小组讨论后的改进#include<stdio.h>#include<iostream>#include<stdlib.h>#include<time.h>int main(){int m=1,n=1;while((m>0&&m<=20)&&(n>0&&n<=20)){printf("输入迷宫行数m(0<m<=20 否则退出):\n");scanf("%d",&m);printf("输入迷宫列数n(0<n<=20 输入0时退出):\n"); scanf("%d",&n);if(m==0||n==0||m>20||n>20){printf("行列数输入不合要求!");break;}int move[4][2]={{0,1},{1,0},{0,-1},{-1, 0}};typedef struct{int x,y;}position;char maze[22][22];position stack[10000];int x,y,i,ok;int top;position p;srand(time(0));for(x=1;x<=m;x++)for(y=1;y<=m;y++)maze[x][y]=48+rand()%2;maze[1][1]='0';maze[m][n]='0';for(x=0;x<=m+1;x++){maze[x][0]='1';maze[x][n+1]='1';}for(y=0;y<=m+1;y++){maze[0][y]='1';maze[m+1][y]='1';}p.x=1;p.y=1;top=1;stack[top]=p;maze[1][1]='.';do{p=stack[top];ok=0;i=0;while((ok==0)&&(i<4)){x=p.x+move[i][0];y=p.y+move[i][1];if(maze[x][y]=='0'){p.x=x;p.y=y;stack[++top]=p;maze[x][y]='.';ok=1;}i++;}if(i==4){top--;}}while((top>0)&&((p.x!=m)||(p.y!=n)));if(top==0)printf("没有路径\n");elseprintf("有路径\n");for(x=0;x<=m+1;x++){printf("\n");for(y=0;y<=n+1;y++)printf("%c ",maze[x][y]);}printf("\n");}}运行结果总结:讨论后的算法最大的改进是在迷宫的生成部分,针对我提出的问题,我们先提出一种算法:是将迷宫的坐标改为由用户自己输入,后来又提出了一种更好的思想,将这个迷宫生产的部分改为由一个随机函数产生。

相关文档
最新文档