迷宫问题课程设计论文

合集下载

数据结构课程设计――迷宫问题课程设计报告

数据结构课程设计――迷宫问题课程设计报告

数据结构课程设计――迷宫问题课程设计报告迷宫问题——王欣歆20080564一(需求设计:以一个m*m 的方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。

设计一个程序,对任意设定的迷宫,求出一条从入口的通道,或得出没有通路的结论。

二(概要设计:存储结构:采用了数组以及结构体来存储数据,在探索迷宫的过程中用到的栈,属于顺序存储结构。

/*八个方向的数组表示形式*/int move[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1, 1}};/*用结构体表示位置*/struct position{int x,y;};position stack[m*m+1];基本算法:走迷宫的过程可以模拟为一个搜索的过程:每到一处,总让它按东、东南、南、西南、西、西北、北、东北8个方向顺序试探下一个位置;如果某方向可以通过,并且不曾到达,则前进一步,在新位置上继续进行搜索;如果8个方向都走不通或曾经到达过,则退回一步,在原来的位置上继续试探下一位置。

每前进或后退一步,都要进行判断:若前进到了出口处,则说明找到了一条通路;若退回到了入口处,则说明不存在通路。

用一个字符类型的二维数组表示迷宫,数组中每个元素取值“0”(表示通路)或“1”(表示墙壁)。

迷宫的入口点在位置(1,1)处,出口点在位置(m,m)处。

设计一个模拟走迷宫的算法,为其寻找一条从入口点到出口点的通路。

二维数组的第0行、第m+1行、第0列、第m+1列元素全置成“1”,表示迷宫的边界;第1行第1列元素和第m行第m列元素置成“0”,表示迷宫的入口和出口;其余元素值用随机函数产生。

假设当前所在位置是(x,y)。

沿某个方向前进一步,它可能到达的位置最多有8个。

如果用二维数组move记录8个方向上行下标增量和列下标增量,则沿第i个方向前进y 一步,可能到达的新位置坐标可利用move数组确定: o x=x+move[i][0]y=y+move[i][1]从迷宫的入口位置开始,沿图示方向顺序依次进行搜索。

迷宫游戏的设计与实现论文

迷宫游戏的设计与实现论文

迷宫游戏的设计与实现摘要设计和实现的迷宫游戏是在VC环境下用C语言编写的,主要是设计迷宫有一个入口和一个出口,游戏者在进入迷宫后,只能从出口出去,否则失败,该程序支持键盘操作,迷宫大小是由游戏者来确定的,可以自动随机的生成迷宫地图,迷宫游戏设计了一个视野窗口,可以支持游戏者漫游到视野范围外的迷宫,游戏者可以从左侧的入口进去,在右下侧的出口退出,遇到墙壁,则游戏者不能通过。

游戏者在迷宫中探索出口的过程中可以使用上,下,左,右键这几个键手动的搜索迷宫的出口。

迷宫的地图是使用绘图函数显示在屏幕上的,是调用easyX函数库来实现的,所以本文最重要的一个部分就是在介绍屏幕显示下的图形模式,和在这种模式下,所调用的一些绘图函数。

关键词:迷宫;回溯;绘图函数Abstract: Design and implementation of the maze game written in C in the VCenvironment is mainly designed maze has one entrance and one exit,after entering the maze, the player can only exit,or else fail, the program supports keyboard operation,maze size is determined by the player automatically randomly generated maze map,maze game,design a vision window,the player can support roaming to the field of view outside of the maze,the player can go from the left side of the entrance in the rightthe under side of the export exit encountered the wall,the player can not.The game in the maze to explore the export process can use the up,down,left,right-export of a few keys to manually search the maze.Map of the maze is displayed on the screen using the drawing function is to achieve to call easyX library, so this article the most important part is the introduction screen display graphics mode,and in this mode,the call drawing functions.Keyword: maze;look back upon;draw function目录引言 (1)1迷宫游戏的概要设计 (2)1.1工具介绍 (2)1.2游戏的主要功能 (3)1.3程序调用的头文件的介绍 (3)2 easy X的介绍 (3)2.1为什么要用easy X (3)2.2 easy X (4)3迷宫中的数据结构 (4)4迷宫游戏中调用的函数 (7)4.1绘图函数的基本知识的介绍 (7)4.2程序中用到的绘图函数 (8)5流程图及模块图 (10)5.1功能模块图 (10)5.2系统流程图 (11)6迷宫游戏的设计思路 (13)7 游戏的关键代码 (18)结论 (21)致谢 (22)参考文献 (45)引言迷宫的问题原本是一个经典的实验心理学的问题,其大概的内容是实验心理学家将老鼠放入从没有顶的大盒子的入口处让其由此进入迷宫。

数据结构课程设计--求解迷宫问题

数据结构课程设计--求解迷宫问题

课程设计(论文)题目名称迷宫求解课程名称数据结构课程设计学生姓名学号系、专业信息工程系、电气信息类(信息类)指导教师申寿云2010年1 月3 日摘要设计一个简单迷宫程序,从入口出发找到一条通路到达出口。

编制程序给出一条通过迷宫的路径或报告一个“无法通过”的信息。

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

用“穷举求解”方法,即从入口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。

假如所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。

可以用二维数组存储迷宫数据,通常设定入口点的下标为(1,1),出口点的下标为(n,n)。

为处理方便起见,可在迷宫的四周加一障碍。

对于迷宫任一位置,均可约定有东、南、西、北四个方向可通。

关键词:迷宫;栈;链表;二维数组目录1 问题描述 (1)2 需求分析 (1)3 概要设计 (1)3.1抽象数据类型定义 (1)3.2模块划分 (2)4 详细设计 (2)4.1数据类型的定义 (2)4.2主要模块的算法描述 (3)5 测试分析 (6)6 课程设计总结 (7)参考文献 (7)附录(源程序清单) (9)1 问题描述迷宫是一个M行N列的0-1矩阵,其中0表示无障碍,1表示有障碍。

设入口为(1,1)出口为(M,N)每次移动只能从一个无障碍的单元移到其周围8个方向上任一无障碍的单元,编制程序给出一条通过迷宫的路径或报告一个“无法通过”的信息。

2 需求分析(1)首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。

求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。

否则报告一个无法通过的信息。

(2)建立InitStack函数,用于构造一个空栈。

(3)建立DestroyStack函数,用于销毁栈。

(4)建立Pop函数,用于删除栈顶元素,返回栈顶元素的值。

迷宫问题-数据结构与算法课程设计报告

迷宫问题-数据结构与算法课程设计报告

合肥学院计算机科学与技术系课程设计报告2008 ~2009 学年第二学期课程数据结构与算法课程设计名称迷宫问题学生名称陈建华专业班级08计本(2)班指导教师王昆仑2010年6月一、问题分析和任务定义1.题目:迷宫的生成与路由。

生成一个N*M(N行M列)的迷宫,0和1分别表示迷宫中的通路和障碍,设计一个程序,完成迷宫的组织与存储,并实现迷宫的路由算法。

即对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论2.设计要求:(1)N和M是用户可配置的,缺省值为50和50。

(2)迷宫的入口和出口分别在左上角和右下角。

(3)求得的通路以二元组( i , j )的形式输出,其中(i, j)指示迷宫中的一个坐标。

(4) 以二维数组存储迷宫数据。

3.问题描述:迷宫是一个矩形区域如图(a)所示,它有一个入口和一个出口,其内部包含能穿越的强或障碍。

迷宫老鼠问题就是要寻找一条从入口到出口的路径。

对这样的矩形迷宫,可以用N*M的矩阵来描述,N和M分别代表迷宫的行数和列数。

这样,迷宫中的每一个位置都可以用行号和列号来指定。

(1,1)表示入口位置,(n,m)表示出口位置;从入口到出口的路径则是由一个位置构成的,每个位置上都没有障碍,且每个位置(第一个除外)都是前一个位置的东、南、西或北的邻居。

为了描述迷宫中位置(i,j)处有无障碍,规定:当位置(i,j)处有一个障碍时,其值为1,否则为0。

这样,如图(a)所示的迷宫就可以用图(b)所示的矩阵来描述。

其中,a11=0表示入口,anm=0表示出口;若aij表示从入口到出口路径上的某个位置,则应该有aij=0经分析,一个简单的求解方法是:从入口出发,沿某一方向进行探索,若能走通,则继续向前走;否则沿原路返回,换一方向再进行搜索,直到所有可能的通路都探索到为止。

即0 1 1 1 1 1 0 0 0 00 0 0 0 0 1 0 1 0 00 0 0 1 0 1 0 0 0 00 1 0 1 0 1 0 1 1 00 1 0 1 0 1 0 1 0 00 1 1 1 0 1 0 1 0 10 1 0 0 0 1 0 1 0 10 1 0 1 1 1 0 1 0 01 0 0 0 0 0 0 1 0 00 0 0 0 0 1 1 1 0 0(a) (b)4.测试用例:手动绘制迷宫正确的输入数据:0 0 0 0 1 01 1 1 0 1 00 1 0 0 0 11 0 1 1 1 1手动绘制迷宫正确的输出结果:随机绘制迷宫错误的输出结果:此迷宫没有通路!注:用一个二维数组表示迷宫,数组中的每个元素表示一个小方格,0和1分别表示迷宫中的通路和障碍。

迷宫景观的设计研究论文(合集5篇)

迷宫景观的设计研究论文(合集5篇)

迷宫景观的设计研究论文(合集5篇)第一篇:迷宫景观的设计研究论文1迷宫景观设计构成要素迷宫景观设计构成要素主要包含出入口、中心、路径、材料、设计高度等几个方面。

1.1出入口设计出入口对迷宫景观设计有着重要的意义。

首先景观出入口设计是把两个分割的空间联系在一起的重要媒介,迷宫景观的出入口相当于整个景观内部与外部连接的门窗。

另外,出入口设计的巧妙与否关乎整个迷宫景观娱乐性的强弱。

出入口设计可以在形式和个数上两个角度变换设计,从而营造趣味性更强的迷宫景观。

常见的入口形式有3种:“I”字型、“T”字型、“十”字型。

体验者选择进入迷宫景观的方式,随着入口设计形式的变换而变化。

入口不仅在形式上变换,还在数量上有选择的设计。

由于出入口数量和位置设计的不同,迷宫景观的体验难度系数也随之加大。

因此,迷宫景观出入口设计的合理性,可以提高体验者游玩迷宫的兴趣和挑战。

1.2中心设计中心景点凝结了整个迷宫景观文化底蕴,表达景观核心主题,不论是古代还是现代的迷宫景观都寄予故事传说,每条路径和每个景点设计都是在编织着美丽的故事。

体验者带着无限的遐想和憧憬寻找迷宫的中心。

1.3路径布置路径是整个迷宫景观设计的精髓所在。

路径设计首先要考虑的问题是,路径与中心景点的位置关系,主要分为路径经过中心景点、路径围绕中心景点、路径远离中心景点。

几种形式的路径在景观设计中交叉使用进而形成路径网络,其中路径在交点处主要有3种基本形式:“十”字型交叉岔口、“Y”字型岔口和“米”字型岔口。

错综复杂的路径迷惑或干扰体验者到达中心景点的选择。

每1种选择并非绝对错也不一定绝对正确,只是选择不同到达中心景点的路径不同,这个过程中伴随着无限的神秘感和趣味性。

甬道宽度设计:根据整体迷宫景观大小、规模和形式设计甬道宽度。

迷宫一般多为圆形、方形和不规则形。

甬道通常设计宽一般为0.8…m、1…m和1.2…m。

每条甬道设计2~3个回合,迷惑体验者,增加景观娱乐性。

1.4墙体高度设计迷宫墙的高度对迷宫游戏难易程度起着至关重要的作用,并与之成正比关系。

数据结构毕业课程设计报告—迷宫求解问题

数据结构毕业课程设计报告—迷宫求解问题

课题设计1:迷宫求解一. 需求分析:本程序是利用非递归的方法求出一条走出迷宫的路径,并将路径输出。

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

二、概要设计:1.抽象数据类型定义:ADT Find{数据对象:D={ai?ai ∈ElemSet,i=1,2,…,n,n≥0}数据关系:R1={<ai-1,ai>?ai-1, ai∈D }基本操作:find (&S)初始条件:已初始化栈S,且栈为空操作结果:从栈S中找出相对应的数据关系,并输出结果}ADT Find2. 主程序的流程以及各程序模块之间的调用关系:(1).定义变量i、j、w、z为整形变量(2).输入迷宫二维数组maze(0:m,0:n)(3).调用子程序find ()(4).结束程序三、相应的源程序如下:#include<stdio.h>#include<stdlib.h>typedef enum { ERROR, OK } Status;typedef struct{int row, line;}PosType;typedef struct{int di, ord;PosType seat;}SElemType;typedef struct{SElemType * base;SElemType * top;int stacksize;}SqStack;Status InitStack(SqStack &S);Status Push(SqStack &S,SElemType &a);Status Pop(SqStack &S,SElemType &a);Status StackEmpty(SqStack S);Status MazePath(int maze[12][12],SqStack &S, PosType start, PosType end);void Initmaze(int maze[12][12],int size);void printmaze(int maze[12][12],int size);Status Pass(int maze[12][12],PosType CurPos);void Markfoot(int maze[12][12], PosType CurPos);PosType NextPos(PosType CurPos, int Dir);void printpath(int maze[12][12],SqStack S,int size);void main (void){SqStack S;int size,maze[12][12];for(int n=0;n<10;n++){printf("创建一个正方形迷宫,请输入迷宫尺寸(注意不要大于50):\n");scanf("%d",&size);if(size<1 || size>10){printf("输入错误!");return;}Initmaze(maze,size);printmaze(maze,size);PosType start,end;printf("输入入口行坐标和列坐标:");scanf("%d",&start.row);scanf("%d",&start.line);printf("输入出口行坐标和列坐标:");scanf("%d",&end.row);scanf("%d",&end.line);if(MazePath(maze,S,start,end))printpath(maze,S,size);else printf("找不到通路!\n\n");}}Status MazePath(int maze[12][12],SqStack &S, PosType start, PosType end){PosType curpos;int curstep;SElemType e;InitStack(S);curpos = start;curstep = 1;do {if (Pass(maze,curpos)){Markfoot(maze,curpos);e.di =1;e.ord = curstep;e.seat= curpos;Push(S,e);if (curpos.row==end.row && curpos.line==end.line)return OK;curpos = NextPos(curpos, 1);curstep++;}else{if (!StackEmpty(S)){Pop(S,e);while (e.di==4 && !StackEmpty(S)) {Markfoot(maze,e.seat);Pop(S,e);}if (e.di<4){e.di++;Push(S, e);curpos = NextPos(e.seat, e.di);}}}} while (!StackEmpty(S));return ERROR;}void Initmaze(int maze[12][12],int size){char select;printf("选择创建方式A:自动生成B:手动创建\n");label:scanf("%c",&select);if(select=='a'||select=='A'){for(int i=0;i<size+2;i++)maze[0][i]=1;for( i=1;i<size+1;i++){maze[i][0]=1;for(int j=1;j<size+1;j++)maze[i][j]=rand()%2;maze[i][size+1]=1;}for(i=0;i<size+2;i++)maze[size+1][i]=1;}else if(select=='b'||select=='B'){printf("按行输入%d*%d数据,0代表可通,1代表不可通(每行以Enter结束):\n",size,size);for(int i=0;i<size+2;i++)maze[0][i]=1;for( i=1;i<size+1;i++){maze[i][0]=1;for(int j=1;j<size+1;j++)scanf("%d",&maze[i][j]);maze[i][size+1]=1;}for(i=0;i<size+2;i++)maze[size+1][i]=1;}else if(select=='\n')goto label;else printf("输入错误!");}void printmaze(int maze[12][12],int size){printf("\n\n");printf("显示所建的迷宫(#表示外面的墙):\n");for(int i=0;i<size+2;i++)printf("%c ",'#');printf("\n");for(i=1;i<size+1;i++){printf("%c ",'#');for(int j=1;j<size+1;j++){printf("%d ",maze[i][j]);}printf("%c",'#');printf("\n");}for(i=0;i<size+2;i++)printf("%c ",'#');printf("\n");}void printpath(int maze[12][12],SqStack S,int size){printf("\n\n通路路径为:\n");SElemType * p=S.base;while(p!=S.top){maze[p->seat.row][p->seat.line]=2;p++;}for(int i=0;i<size+2;i++)printf("%c ",'#');printf("\n");for(i=1;i<size+1;i++){printf("%c ",'#');for(int j=1;j<size+1;j++){if(maze[i][j]==2) printf("%c ",'0');else printf(" ");}printf("%c",'#');printf("\n");}for(i=0;i<size+2;i++)printf("%c ",'#');printf("\n\n"); }Status Pass(int maze[12][12],PosType CurPos){if (maze[CurPos.row][CurPos.line]==0)return OK;else return ERROR;}void Markfoot(int maze[12][12],PosType CurPos){maze[CurPos.row][CurPos.line]=1;}PosType NextPos(PosType CurPos, int Dir){PosType ReturnPos;switch (Dir){case 1:ReturnPos.row=CurPos.row;ReturnPos.line=CurPos.line+1;break;case 2:ReturnPos.row=CurPos.row+1;ReturnPos.line=CurPos.line;break;case 3:ReturnPos.row=CurPos.row;ReturnPos.line=CurPos.line-1;break;case 4:ReturnPos.row=CurPos.row-1;ReturnPos.line=CurPos.line;break;}return ReturnPos;}Status InitStack(SqStack &S){S.base=(SElemType *)malloc(100*sizeof(SElemType));if(!S.base)return ERROR;S.top=S.base;S.stacksize=100;return OK;}Status Push(SqStack &S,SElemType &a){*S.top++=a;return OK;}Status Pop(SqStack &S,SElemType &a){if(S.top==S.base)return ERROR;a=*--S.top;return OK;}Status StackEmpty(SqStack S){if(S.top==S.base)return OK;return ERROR;}以下为测试数据:输入一个矩阵,例如:1 0 0 1 10 0 1 1 11 0 0 0 10 1 0 1 11 1 0 0 0输入入口行坐标和列坐标:1 2输入出口行坐标和列坐标:5 5通路路径为:课题设计3:joseph环一. 需求分析:利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。

迷宫课程设计报告

迷宫课程设计报告

课程设计报告(论文)报告(论文)题目:迷宫问题哈夫曼编码/译码实现作者所在系部:计算机科学与工程系作者所在专业:网络工程所在班级:作者姓名:作者学号:指导教师姓名:完成时间:北华航天工业学院教务处制摘要在当前的市场经济体制下,企业要想提高市场的竞争力,不但要有好的产品,同时也要有好的信息查询系统,以实现企业高效率的管理及查询。

在本次课程设计中,主要解决的问题就是迷宫问题和利用创建的哈夫曼树进行编码/译码,运用C++语言编写的程序。

在迷宫问题中,可由操作者自己设计迷宫的内部构造,迷宫的入口点已被社定。

操作者自己社定迷宫出口点,当操作者输入的出口点超出迷宫本身的时候,做出提示:输入有误,请操作者再次输入迷宫出口点。

根据操作者输入的出口点求出走出迷宫的一条路径。

如果能走出迷宫,再求解最短路径。

操作者可再次设置迷宫的出口点,采取相同的操作。

该程序已经过全面的系统测试,能够很好的运行,达到了预期的效果。

哈夫曼编码/译码系统主要有五个功能模块:1:创建哈夫曼树;2:打印哈夫曼编码规则;3:规则根据编码规则进行编码,并将编码保存在D:code1file.dat文件中;4:对保存在code1file.dat文件中的二进制代码进行译码,并将译码保存在D:code2file.dat文件中;5:打印哈夫曼编码。

该程序已经过全面的系统测试,能够很好的运行,达到了预期的效果。

例如:无效数字的输入本系统的自动判断,按照不同的关键字输出结果,人性化的输入界面(包括输入提示,错误提示等等)。

在下面各章节的介绍中,你会了解到各程序的具体设计与实现,介绍中包括系统需求分析,概要设计,详细设计,调试分析以及测试记过等。

此次程序设计使我们进一步了解C++的精华之处及数据结构的一些编程思想。

C++是优秀的计算机程序设计语言,它的功能相当的强大。

C++是程序设计员必备的一种语言,本次课程设计帮助我们深入的了解了C++的精髓所在,为我们以后的学习打下了坚实的基础。

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

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

摘要本课题主要研究在C语言的基础上用栈和队列两种放过实现求解迷宫,迷宫用一个二维数组来表示。

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

关键词:迷宫;栈;队列;二维数组目录1问题描述 (1)2需求分析 (1)2.1课程设计目的 (1)2.2课程设计任务 (1)2.3设计环境 (1)3概要设计 (2)3.1数据结构设计 (2)3.2系统流程图 (4)4编码与实现 (6)4.1分析 (6)4.2具体代码实现 (9)5测试分析 (17)6课程设计总结 (18)参考文献 (19)致谢 (19)1问题描述设计一个简单迷宫程序,从入口出发,按某一方向向前探索,若能走通(未走过的),即某处可以到达,则到达新点,否则试探下一方向;若所有方向均没有通路,则沿原点返回前一点,换下一个方向在继续试探,直到所有可能的通路都探索到,或找到一条通路,或无路可走又返回到入口点。

并利用两种方法实现:一种用栈实现,另一种用队列实现。

2 需求分析2.1课程设计目的学生在教师指导下运用所学课程的知识来研究、解决一些具有一定综合性问题的专业课题。

通过课程设计(论文),提高学生综合运用所学知识来解决实际问题、使用文献资料、及进行科学实验或技术设计的初步能力,为毕业设计(论文)打基础。

2.2课程设计任务(1)定义一个二维数组存放迷宫数据;(2)画出查询模块的流程图;(3)编写代码;(4)程序分析与调试。

2.3设计环境(1)WINDOWS 2000/2003/XP/7/Vista系统(2)Visual C++或TC集成开发环境3 概要设计3.1数据结构设计(1)迷宫类型设迷宫为M行N列,利用maze[M][N]来表示一个迷宫,maze=0或1,其中0表示通路,1表示不通。

当从某点试探是,中间点有8个不同点可以试探,而四个角有3个方向,其他边缘点有5个方向,为使问题更容易分析我们用maze[M+2][N+2]来表示迷宫,而迷宫四周的值全部为1。

定义如下:#define M 6/*迷宫的实际行*/#define N 8 /*迷宫的实际列*/int maze[M+2][N+2];(2)队列的类型定义队列的有关数据结构、试探方向等和栈的求解方法处理基本相同。

不同的是:如何存储搜索路径。

在搜索过程中必须几下每一个可到达的坐标点,以便从这些点出发继续向四周搜索。

到达迷宫的出口点(m,n)后,为能够从出口沿搜索路径回溯直至入口,对于每一点,记下坐标点的同时,还要记下到达该点的前驱点,因此用一个结构体数组ele[MAX]作为队列的存储空间,因为每一点至少被访问一次,所以MAX 至多等于m*n。

该结构体有三个域:x、y和pre。

其中x、y分别为所到达点的坐标,pre为前驱点在elem中的下标。

除此之外,还需设定头、尾指针,分别指向队头,队尾。

类型定义如下:typedef struct //队的相关类型定义{ int x,y;int pre;}Elemtype;typedef struct //队列的类型定义{ Elemtype elem[MAXSIZE];int front,rear;int len;}SqQueue;(3)队列的相关模块定义函数DLmazepath( ),利用队列实现迷宫求。

定义函数DLmazepath( ),实现队列的迷宫路径输出。

定义函数I nitQueue(),实现队列的初始化。

定义函数QueueEmpty( ),判断队列是否为空,为空返回1,否则返回0.定义函数GetHead (SqQueue q,Elemtype *e),实现队头元素的读取。

定义函数EnQueue(SqQueue *q,Elemtype e),实现入队操作。

定义函数DeQueue(SqQueue *q,Elemtype *e),实现出队操作。

定义函数Sprint(int a[M+2][N+2]),实现,迷宫的输出。

定义栈相关的函数见同伴的报告。

3.2 系统流程图(1)主函数图3.1 主函数流程图(2)队列求解迷宫图3.2 队列求解迷宫流程图4 编码与实现4.1分析(1)主函数void main(){int a,i,j,maze2[M+2][N+2];/*构造一个迷宫*/int maze[M+2][N+2]={{1,1,1,1,1,1,1,1,1,1},{1,0,1,1,1,0,1,1,1,1},{1,1,0,1,0,1,1,1,1,1},{1,0,1,0,0,0,0,0,1,1},{1,0,1,1,1,0,1,1,1,1},{1,1,0,0,1,1,0,0,0,1},{1,0,1,1,0,0,1,1,0,1},{1,1,1,1,1,1,1,1,1,1}};item move[8]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};/*坐标增量数组move的初始化*/为使得程序更加人性化,更加友好,因此可将系统输出界面设置如下:printf(" |*****************迷宫求解系统*****************|\n");printf(" | 1 、栈方法求解迷宫的路径|\n");printf(" | 2 、队列求解的迷宫路径|\n");printf(" | 3、退出系统|\n");printf(" |*******************************************|\n");printf("\t\n\n请选择(0-3):"); scanf("%d",&a);while(a!=3){ switch(a){ Case 1:Sprint(maze);printf(“路径为:\n");Zmazepath(maze,move);break;Case2:Sprint(maze2);printf("路径:\n");DLmazepath(maze2,move);break;default : printf("\t\t选择错误!!\n");}printf("\t\n请选择(0-3).....\n"); scanf("%d",&a);}printf("\n\t\t非常感谢您的使用!\n");}(2)利用队列实现迷宫求解伪代码如下:int DLmazepath_(int maze[M+2][N+2],item move[8])/*采用队列的迷宫算法。

Maze[M+2][N+2]表示迷宫数组,move[8]表示坐标增量数组*/{队的初始化;将入口点坐标及到达该点的方向(设为-1)入队;while(队不为空){ for( 从1到8个方向)求新坐标点坐标,并将可到达点分别入队;if(点(x,y)为出口点)结束输出路径,迷宫有路;当前点搜索完8个方向后出队;}return o /*迷宫五路*/}void DLprintpath(SqQueue q)//输出迷宫路径,队列中保存的就是一条迷宫的通路{ int i; i=q.rear-1;do{ printf("(%d,%d)<--",(q.elem[i]).x,(q.elem[i]).y);i=(q.elem[i]).pre;}while(i!=-1)利用栈方法和队列方法用到的是同一个迷宫数组,在使用栈方法实现迷宫求解时,为避免死循环改变了原来的迷宫数组的个别路径值,因此使用队列求解时不能得到相应的路径解,为避免此,我们可在用栈方法求解迷宫路径之前将数组赋值给另一个数组,这样队列求解迷宫时可以再原来不改变的迷宫数组下进行。

具体实现代码如下:for(i=0;i<M+2;i++)for(j=0;j<N+2;j++){ maze2[i][j]=maze[i][j];}(3)队列的操作void InitQueue(SqQueue *q) /*队列的初始化*/{ 将队中元素赋值为0;}int QueueEmpty(SqQueue q) /*判队空*/{ if(队长度为0)返回1;else返回0;}void GetHead (SqQueue q,ElemType *e)/*读队头元素*/{ if(队的长度为0)输出提示队列为空;else 将队中值赋给e;}void EnQueue(SqQueue *q,ElemType e)/*入队*/{if(队列长度已满)输出提示;else{将e中元素赋给队列;队尾指针指向下一个元素;队长加1;}}void DeQueue(SqQueue *q,ElemType *e)/*出队*/{if(判队空)输出提示;else {将队中元素赋给e;队头指向下一个元素;队长减1;} }4.2 具体代码实现#include<stdio.h>#include<stdlib.h>#define M 6#define N 8#define MAXSIZE 100#define MAX M*Ntypedef struct //栈的相关类型定义{int x,y,d; //d 下一步方向}elemtype;typedef struct{elemtype data[MAXSIZE];int top;}Sqstack;typedef struct{int x,y;}item;typedef struct //队的相关类型定义{int x,y;int pre;}Elemtype;typedef struct //队列的类型定义{Elemtype elem[MAXSIZE];int front,rear;int len;}SqQueue;/* 栈函数*/void InitStack(Sqstack *s) //构造空栈{s->top=-1;}int Stackempty(Sqstack s) //判断栈是否为空{if(s.top==-1) return 1;else eturn 0;}void push(Sqstack *s,elemtype e) //入栈{if(s->top==MAXSIZE-1){ printf("Stack is full\n");return;}s->top++;s->data[s->top].x=e.x;s->data[s->top].y=e.y;s->data[s->top].d=e.d;}void pop (Sqstack *s,elemtype *e) // 出栈算法{if(s->top==-1){printf("Stack is empty\n");return;}e->x=s->data[s->top].x;e->y=s->data[s->top].y;e->d=s->data[s->top].d;s->top--;}/* 队函数*/void InitQueue(SqQueue *q) //队的初始化{q->front=q->rear=0;q->len=0;}int QueueEmpty(SqQueue q) //判断队空{if (q.len==0)return 1;else return 0;}void GetHead (SqQueue q,Elemtype *e)//读队头元素{if (q.len==0)printf("Queue is empty\n");else*e=q.elem[q.front];}void EnQueue(SqQueue *q,Elemtype e)//入队{if(q->len==MAXSIZE)printf("Queue is full\n");else{q->elem[q->rear].x=e.x;q->elem[q->rear].y=e.y;q->elem[q->rear].pre=e.pre;q->rear=q->rear+1;q->len++;}}void DeQueue(SqQueue *q,Elemtype *e) //出队{if(q->len==0)printf("Queue is empty\n");else{e->x=q->elem[q->rear].x;e->y=q->elem[q->rear].y;e->pre=q->elem[q->rear].pre;q->front=q->front+1;q->len--;}}void Sprint(int a[M+2][N+2]){int i,j;printf("迷宫为:\n");for(i=0;i<M+2;i++){for(j=0;j<N+2;j++)printf("%2d",a[i][j]);printf("\n");}}void Zprintpath(Sqstack s){ //输出迷宫路径,栈中保存的就是一条迷宫的通路elemtype temp;printf("(%d,%d)<--",M,N);while(!Stackempty(s)){pop(&s,&temp);printf("(%d,%d)<--",temp.x,temp.y);}printf("\n");}void Zmazepath(int maze[M+2][N+2],item move[8]) { //栈的迷宫求解输出Sqstack s;elemtype temp;int x,y,d,i,j;InitStack(&s);//栈的初始化temp.x=1;temp.y=1;temp.d=-1;push(&s,temp);while(!Stackempty (s)){pop(&s,&temp);x=temp.x;y=temp.y;d=temp.d+1;while(d<8){i=x+move[d].x;j=y+move[d].y;if(maze[i][j]==0){temp.x=x;temp.y=y;temp.d=d;push(&s,temp);x=i;y=j;maze[x][y]=-1;if(x==M&&y==N){Zprintpath(s);return;}else d=0;}//ifelse d++;}//while} //whilereturn;printf("迷宫无路\n");return;}void DLprintpath(SqQueue q){//输出迷宫路径,队列中保存的就是一条迷宫的通路int i;i=q.rear-1;do{printf("(%d,%d)<--",(q.elem[i]).x,(q.elem[i]).y);i=(q.elem[i]).pre;} while(i!=-1);printf("\n");}void DLmazepath(int maze1[M+2][N+2],item move[8]) { //队列的迷宫求解SqQueue q;Elemtype head,e;int x,y,v,i,j;InitQueue(&q); //队列的初始化e.x=1;e.y=1;e.pre=-1;EnQueue (&q,e);maze1[1][1]=-1;while(!QueueEmpty (q)){ GetHead(q,&head);x=head.x;y=head.y;for(v=0;v<8;v++){ i=x+move[v].x;j=y+move[v].y;if(maze1[i][j]==0){ e.x=i;e.y=j;e.pre=q.front;EnQueue(&q,e);maze1[x][y]=-1;} //ifif(i==M&&j==N){ DLprintpath(q);return ;}} //forDeQueue(&q,&head);}//whileprintf("迷宫无路!\n");return;}void main(){ int a,i,j,maze2[M+2][N+2];int maze[M+2][N+2]={{1,1,1,1,1,1,1,1,1,1},{1,0,1,1,1,0,1,1,1,1},{1,1,0,1,0,1,1,1,1,1},{1,0,1,0,0,0,0,0,1,1},{1,0,1,1,1,0,1,1,1,1},{1,1,0,0,1,1,0,0,0,1},{1,0,1,1,0,0,1,1,0,1},{1,1,1,1,1,1,1,1,1,1}};/*构造一个迷宫*/item move[8]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};/*坐标增量数组move的初始化*/for(i=0;i<M+2;i++)for(j=0;j<N+2;j++){ maze2[i][j]=maze[i][j];}printf(" |******************迷宫求解系统******************|\n"); printf(" | |\n"); printf(" | 1 、栈求解迷宫的路径|\n"); printf(" | |\n"); printf(" | 2 、队列求解的迷宫路径|\n"); printf(" | |\n"); printf(" | 3 、退出系统|\n"); printf(" | |\n"); printf(" |**********************************************|\n"); printf(" \t\n\n请选择(0-3):"); scanf("%d",&a);while(a!=3){switch(a){case 1:Sprint(maze); printf("求解路径为:\n");Zmazepath(maze,move);break;case 2:printf("求解路径为:\n");DLmazepath(maze2,move);break;default : printf("\t\t选择错误!!\n");}printf("\t\n请选择(0-3):"); scanf("%d",&a);}printf("\n\t\t结束退出程序!\n");}5 测试分析测试数据及结果如下:(1)系统友好界面输出图5.1 进入系统界面运行结果(2)选择1,运行结果输出如下:图5.2 迷宫以及使用栈求解迷宫路径的输出(3)选择2、3 运行结果如下:图5.3 迷宫以及使用队列求解迷宫路径的输出(4)选择3运行结果如下:图5.3 退出程序根据结果分析:利用栈求得的路径不一定是最短路径,而用队列求得的路径是最短路径。

相关文档
最新文档