迷宫问题c++实验报告
- 格式:docx
- 大小:252.70 KB
- 文档页数:11
《数据结构与算法》实验报告评分依据及结果一、需求分析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.本程序界面设计合理,以空格为通路,感叹号!为障碍,笑脸为起始点,*为行走路线,心形为出口设计精巧,便于用户使用。
迷宫问题实验报告篇一:迷宫问题实验报告武汉纺织大学数学与计算机学院数据结构课程设计报告迷宫问题求解学生姓名:学号:班级:指导老师:报告日期:一、问题描述以一个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%)(本部分应包括:抽象数据类型具体实现的函数原型说明、关键操作实现的伪码算法、函数设计、函数间的调用关系,关键的程序流程图等,给出关键算法的时间复杂度分析。
实验心理学报告.迷宫实验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)为添加在迷宫外围的一圈障碍。
实习报告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 课程设计报告迷宫一、教学目标本课程的教学目标是让学生掌握迷宫问题的基本概念、算法和编程技巧。
通过本课程的学习,学生应能理解迷宫问题的数学模型,掌握常用的迷宫算法,并能够运用编程语言实现迷宫的求解。
此外,学生还应培养解决问题的能力和创新思维,提高对计算机科学和编程的兴趣。
具体来说,知识目标包括:1.了解迷宫问题的背景和应用场景。
2.掌握迷宫问题的数学模型和基本概念。
3.熟悉常用的迷宫算法及其特点。
4.理解编程语言在解决迷宫问题中的应用。
技能目标包括:1.能够运用迷宫算法求解简单迷宫问题。
2.能够运用编程语言实现迷宫算法的求解。
3.能够对迷宫算法进行优化和改进。
情感态度价值观目标包括:1.培养学生对计算机科学和编程的兴趣。
2.培养学生解决问题的能力和创新思维。
3.培养学生的团队合作意识和沟通能力。
二、教学内容本课程的教学内容主要包括迷宫问题的基本概念、算法和编程技巧。
具体内容包括:1.迷宫问题的背景和应用场景。
2.迷宫问题的数学模型和基本概念。
3.常用的迷宫算法及其特点。
4.编程语言在解决迷宫问题中的应用。
教学大纲安排如下:第一课时:介绍迷宫问题的背景和应用场景,引入迷宫问题的数学模型和基本概念。
第二课时:介绍常用的迷宫算法及其特点,引导学生理解编程语言在解决迷宫问题中的应用。
第三课时:通过案例分析,让学生运用迷宫算法求解简单迷宫问题,培养学生的编程能力。
第四课时:引导学生对迷宫算法进行优化和改进,提高学生的解决问题的能力。
第五课时:进行课程总结和回顾,让学生展示自己的迷宫求解成果,进行交流和评价。
三、教学方法本课程的教学方法采用讲授法、讨论法和实验法相结合的方式。
通过讲授法,向学生传授迷宫问题的基本概念、算法和编程技巧;通过讨论法,引导学生进行思考和交流,培养学生的创新思维;通过实验法,让学生动手实践,培养学生的编程能力和解决问题的能力。
在教学过程中,教师应根据学生的实际情况,灵活运用不同的教学方法,以激发学生的学习兴趣和主动性。
数据结构实训报告题目:迷宫问题院系:信息科技学院专业:计算机科学与技术姓名:黄经伟学号: 13指导教师:梁海日期: 2013年1月6日桂林电子科技大学信息科技学院目录迷宫问题 ............................................................................................................................. - 2 -一、设计需求 ..................................................................................................... - 2 -二、概要设计 ..................................................................................................... - 3 -1、系统设计 ............................................................................................... - 3 -1.1 总体设计.................................................................................... - 3 -1.2 详细设计.................................................................................... - 3 -执行流程...................................................................................... - 3 -3、系统实现 ............................................................................................... - 4 -3.1 编码 ........................................................................................... - 4 -3.1.1 类和结构体的代码.......................................................... - 4 -3.2 测试与调试................................................................................ - 5 -3.2.1 概述.................................................................................... - 5 -3.2.2 程序测试............................................................................ - 5 -4、系统维护 ............................................................................................... - 9 -5、归纳总结 ............................................................................................. - 10 -5.1 开发经验.................................................................................. - 10 -5.2 实训中遇到的问题及解决方法.............................................. - 10 -5.3感想和心得体会....................................................................... - 10 -迷宫问题【摘要】随着信息科技的发展,我们可以在计算机上设计一些系统来计算一些比较复杂的问题,例如:迷宫问题。
实验报告课程名:数据结构(C语言版)实验名:迷宫问题II姓名:班级:学号:撰写时间:2014/10/10一实验目的与要求1. 了解栈的应用2. 利用栈在迷宫中找到一条路二实验内容•一个迷宫如图1所示, 是由若干个方格构成的一个矩形, 其中有唯一的一个入口(用⃝标示), 有唯一的一个出口(用△标示). 图中深色的方格无法到达, 浅色的方格都是可以到达的. 每一次只能从当前方格前进到与当前方格有公共边的方格中(因此前进方向最多有四个).•本次实验的迷宫问题要求找到从入口到出口的最短的路.图1:迷宫三实验结果与分析程序:#include <stdio.h>#include <stdlib.h>int Maze(int ox,int oy,int ex,int ey,int rnum,int cnum,int a[rnum][cnum]){int b[rnum][cnum];int i,j,Znum=0;for(i=0;i<rnum;++i){for(j=0;j<cnum;++j){b[i][j]=a[i][j];if(a[i][j]==0){Znum=Znum+1;}}}int Qx[Znum+1], Qy[Znum+1], P[Znum+1], head=0, tail=0; for(i=0;i<Znum+1;++i){Qx[i]=-10;Qy[i]=-10;P[i]=-10;}/*int dx[4] = {0,1,0,-1};int dy[4] = {-1,0,1,0};int neighbor_num = 4;*/int dx[8] = {-1, 0, 1,1,1,0,-1,-1};int dy[8] = {-1,-1,-1,0,1,1, 1, 0};int neighbor_num = 8;if(ox==ex && oy==ey){printf("(%d,%d)",ox,oy);}else{Qx[tail]=ox;Qy[tail]=oy;P[tail]=-1;++tail;b[ox][oy]=2;}int brand = -1;while(tail>head){for(i=0;i<neighbor_num;i++){int tx = Qx[head]+dx[i];int ty = Qy[head]+dy[i];if(b[tx][ty]==0){if(tx==ex && ty==ey){printf("(%d,%d), ",tx,ty);int t = head;while(t>=0){printf("(%d,%d), ",Qx[t],Qy[t]);t=P[t];}head=tail;brand=1;break;}else{Qx[tail]=tx;Qy[tail]=ty;P[tail]=head;++tail;b[tx][ty]=2;}}}++head;}return(brand);}int main(int argc, char *argv[]) {int rnum = 10;int cnum = 10;int a[10][10]={{1,1,1,1,1,1,1,1,1,1},{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,0,1},{1,0,1,1,1,0,0,0,0,1},{1,0,0,0,1,0,0,0,0,1},{1,0,1,0,0,0,1,0,0,1},{1,0,1,1,1,0,1,1,0,1},{1,1,0,0,0,0,0,0,0,1},{1,1,1,1,1,1,1,1,1,1}};//假设外面有一层不可到达的方块,故迷宫成了10乘10型int ox=1,oy=1,ex=rnum-2,ey=cnum-2;int brand = Maze(ox,oy,ex,ey,rnum,cnum,a);if(brand<0){printf("There is no way\n");}return 0;}图1:实验结果截图。
c 走迷宫课程设计报告一、课程目标知识目标:1. 学生能理解并掌握走迷宫的基本概念,包括迷宫的构成元素、规则及解决策略。
2. 学生能够运用方向辨别、空间想象力以及逻辑推理能力,解决迷宫问题。
3. 学生能够结合数学知识,如坐标系、路径选择等,分析并优化迷宫走法。
技能目标:1. 培养学生运用观察、分析、推理等解决问题的能力,提高解决复杂迷宫问题的效率。
2. 培养学生团队协作和沟通能力,通过小组讨论,共同探索迷宫解法。
3. 提高学生的动手操作能力,通过制作简易迷宫,加深对迷宫结构的理解。
情感态度价值观目标:1. 培养学生对迷宫探索的兴趣,激发学习数学的热情,增强自信心。
2. 培养学生面对困难时保持耐心、细心的态度,勇于尝试,善于总结经验。
3. 培养学生合作意识,学会尊重他人,分享学习成果。
课程性质:本课程为趣味数学课程,旨在通过走迷宫活动,将数学知识与实践相结合,提高学生的综合素养。
学生特点:学生处于小学高年级阶段,具有一定的方向感、空间想象力和逻辑推理能力,但需加强合作与沟通能力的培养。
教学要求:注重培养学生的动手实践能力,将理论知识与实际操作相结合,使学生在轻松愉快的氛围中学习,提高学习效果。
通过分解课程目标为具体学习成果,为教学设计和评估提供明确方向。
二、教学内容本课程教学内容紧密结合课程目标,选取以下内容进行组织教学:1. 迷宫基础知识:包括迷宫的起源、构成元素、分类及规则,让学生了解迷宫的背景知识,为解决迷宫问题奠定基础。
2. 方向辨别与空间想象力:运用教材中关于方向的知识,培养学生的空间想象力,通过实际操作,让学生学会在迷宫中正确判断方向。
3. 逻辑推理与路径选择:结合教材中逻辑推理内容,指导学生运用排除法、递推法等方法,寻找迷宫的最佳路径。
4. 数学知识在实际中的应用:运用坐标系、几何图形等数学知识,分析迷宫结构,提高解决问题的效率。
5. 小组合作与沟通:组织学生进行小组讨论,共同解决迷宫问题,培养学生的团队协作能力和沟通能力。
《数据结构与算法》实验报告评分依据及结果一、需求分析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.本程序界面设计合理,以空格为通路,感叹号!为障碍,笑脸为起始点,*为行走路线,心形为出口设计精巧,便于用户使用。
一、实验内容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.实验题目以一个mXn的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。
设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
2.需求分析本程序使用VC编写,实现设定迷宫或自动生成迷宫长方阵表的功能,并且求出一条从指定入口到指定出口的通路,或得出没有通路的结论。
①输入的形式和输入值的范围:A.输入指定的数字,以此选择迷宫的创建方式,分为手动创建迷宫和自动创建迷宫B. 输入迷宫阵表的行数和列数,行数和列数不超过40行C. 手动创建迷宫时,需要输入迷宫结点的通畅和障碍情况,0和1分别表示迷宫中的通路和障碍。
②输出的形式:输出没有通路的结论,或者输出一个长方阵表,其中路径的每个结点都输出→、↓、←、↑之一,表示从当前结点到下一个结点的方向。
③程序所能达到的功能:实现设定迷宫或自动生成迷宫长方阵表的功能,并且求出一条从指定入口到指定出口的通路(迷宫的入口指定为坐标为(1,1)的结点,迷宫的出口指定为坐标为(迷宫最大行,迷宫最大列)的结点),或得出没有通路的结论。
④测试数据:输入数据:A.出现选择生成迷宫方式的菜单时,输入1(即手动输入数据,生成迷宫);B.输入迷宫的行数和列数,行数输入3,列数输入3;C.输入每个迷宫结点的信息:0 0 11 0 01 0 0输出结果:→↓ 11 →↓1 0 03.概要设计为了实现上述程序功能,需要定义迷宫的抽象数据类型:typedef struct Maze creat_manual()初始条件:无操作结果:手动创建一个迷宫。
B. Maze creat_automatic()初始条件:无操作结果:自动创建一个迷宫。
C. int found(int x,int y,Point *head)初始条件:存在一个存放结点的链栈操作结果:查找栈中是否有head指针内所含的坐标;若含,则返回1,否则返回0。
D. Point * find_road(Maze a)初始条件:存在一个迷宫操作结果:返回一条通路或者NULLE. void display(Point *po,Maze a)初始条件:存在一个迷宫操作结果:输出结果。
迷宫课程设计报告西安郵電大學数据结构课程设计报告题目:迷宫问题院系名称:计算机学院专业名称:软件工程班级:1101学生姓名:武妍娜学号(8位):04113027指导教师:李培设计起止时间:2012年12月3日~2012年12月14日一. 设计目的1.熟悉C语言程序的编辑、编译链接和运行的过程,能够熟练地编辑、编译及调试程序。
2.掌握文件和文件指针的概念以及文件的定义方法,学会熟练使用文件打开、关闭、读、写等基本操作。
3.熟练掌握结构体、链表、指针的使用,及函数间的调用。
4.能够熟练运用所学栈的相关知识及操作,顺利完成题目的要求。
二. 设计内容迷宫是实验心理学中一个古典问题。
用计算机解迷宫路径的程序,就是仿照人走迷宫。
计算机解迷宫时,通常用的是"穷举求解"的方法,即从入口出发,顺某一方向向前探索,若能走通,则继续往前走;否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到为止。
1.功能与数据需求迷宫求解问题描述:以一个M×N的矩阵表示迷宫,0和1分别表示迷宫中的通路和障碍。
设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
1.1 题目要求的功能(1)基本要求:首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。
求得的通路以二元组(i,j)的形式输出,其中:(i,j)指迷宫中对应的坐标。
(2)测试数据:①左上角(1,1)为入口,右下角(9,8)为出口。
②左上角(1,1)为入口,右上角(1,8)为出口。
(3)如下图所示:1.2 扩展功能(1)编写非递归形式的算法,求得迷宫中所有可能的通路;(2)以方阵形式输出迷宫及其通路2.界面需求(1)在菜单中选择要执行的操作(2)输出方阵迷宫(3)用户自己输入迷宫起始位置(4)输出所走的迷宫路径(5)输出方阵路径,并保存到文件中3.开发环境与运行需求Microsoft Visual C++6.0Ubuntu三.概要设计1.功能模块图;本程序包含三个模块主模块(1)主程序模块:void main () {初始化; do {接受命令; 处理命令;}while (命令!=“退出”);}(2)栈模块——实现栈抽象数据类型 (3)迷宫模块——实现迷宫抽象数据类型2.各个模块详细的功能描述。
目录第一章:设计问题描述与分析 (1)1.1.课程设计内容 (1)1.2. 问题分析 (1)1.3.功能实现 (2)1.4.运行环境 (3)第二章:算法设计与流程图 (4)2.1.主函数的流程图 (4)2.2.概要设计 (5)2.4详细设计 (6)2.4.1. 节点类型和指针类型 (6)2.4.2.迷宫的操作 (6)(1)生成迷宫 (6)(2)打印迷宫矩阵与字符图形 (7)(3)迷宫求解路由求解操作 (7)(4)打印迷宫通路坐标 (8)(5)输出迷宫通路的字符图形 (8)2.4.3. 主函数 (9)第三章:调试分析 (10)第四章:使用说明 (11)第五章:测试结果 (12)附录1 (19)附录2 (19)第一章:设计问题描述与分析1.1.课程设计内容:该系统是由C 语言编写的生成一个N×M(N行M列)的迷宫,完成迷宫的组织和存储,并实现迷宫路由算法。
基本要求1、 N和M是用户可配置的,缺省值为50和50。
2、迷宫的入口和出口分别在左上角和右下角。
提示:(1)可以使用二维数组maze[M+2][N+2]表示迷宫,其中M,N为迷宫的行、列数,当元素值为0时表示该点是通路,当元素值为1时表示该点是墙。
老鼠在每一点都有4种方向可以走,可以用数组move[4]来表示每一个方向上的横纵坐标的偏移量,可用另一个二维数组mark[M+2][N+2]记录节点的访问情况。
(2)可以选用深度优先算法或广度优先算法实行,迷宫可由自动或手动生成。
测试用例应该包含有解迷宫和无解迷宫。
1.2. 问题分析本程序要求实现迷宫问题的相关操作,包括迷宫的组织和存储,并实现迷宫路由算法(即查找迷宫路径)。
程序所能达到的:具体包括迷宫的建立,迷宫的存储(迷宫由自动生成或手动生成),迷宫中路径的查找迷宫是一个矩形区域,迷宫存在一个入口和一个出口,其内部包含了不能穿越的墙或者障碍。
迷宫的建立即是建立这样一个迷宫矩阵,用于存储迷宫信息,包括可穿越的路和不可穿越的墙或者障碍,分别用0表示通路,1表示障碍。
一、实验背景迷宫游戏是一种古老而经典的智力游戏,其历史悠久,源远流长。
近年来,随着计算机技术的发展,迷宫游戏逐渐成为了一种新型的娱乐方式。
为了探究迷宫游戏在计算机编程中的应用,我们设计并实现了一个基于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)找出所有路径和最短路径:在搜索过程中记录所有路径,并找出最短路径。
数据结构实验报告班级:姓名:学号:组员:问题描述:迷宫实验是取自心理学的一个古典实验。
在该实验中,把一只老鼠从一个无顶大盒子的门放入,在盒中设置了许多墙,对行进方向形成了多处阻挡。
盒子仅有一个出口,在出口处放置一块奶酪,吸引老鼠在迷宫中寻找道路以到达出口。
对同一只老鼠重复进行上述实验,一直到老鼠从入口到出口,而不走错一步。
老鼠经多次试验终于得到它学习走迷宫的路线。
设计功能要求:迷宫由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");}}运行结果总结:讨论后的算法最大的改进是在迷宫的生成部分,针对我提出的问题,我们先提出一种算法:是将迷宫的坐标改为由用户自己输入,后来又提出了一种更好的思想,将这个迷宫生产的部分改为由一个随机函数产生。