迷宫问题课程设计论文

合集下载

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

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

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

迷宫求解课程设计(完整)

迷宫求解课程设计(完整)

一、需求分析本课程设计是解决迷宫求解的问题,从入口出发,顺某一方向向前探索,若能走通,则继续往前走;否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到为止。

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

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

所谓“下一位置”指的是当前位置四周4个方向(东、南、西、北)上相邻的方块。

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

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

二、数据结构1. 数据结构设计考虑1) 建立一个二维数组表示迷宫的路径(0表示通道,1表示墙壁);2) 创建一个栈,用来存储“当前路径”,即“在搜索过程中某一时刻所在图中某个方块位置”。

2. 逻辑结构存储结构1) 创建一个Int类型的二维数组int maze[n1][n2],用来存放0和1 ;2) 创建一个结构体用来储存数组信息(数组的横坐标X,数组的纵坐标Y,方向C)typedef struct node{int x;int y;int c;}linkstack;3) 创造一个栈包括(top表示栈顶元素)linkstack top[n1*n2];三、算法设计首先,创建数组的大小,此数组大小要求用户自己输入。

具体算法:printf("输入迷宫大小(提示:行列数不能超过50!):");scanf("%d",&g);printf("大小创建完毕,请输入迷宫:\n");其次,用户自己定义迷宫的内容,算法:void shuzu(int g,int h){int a,b;for(a=0;a<g;a++)for(b=0;b<h;b++)scanf("%d",&maze[a][b]);}第三,产生迷宫,算法:void scsu(int g,int h){int a,b;printf("生成的迷宫是:\n");for(a=0;a<g;a++){ for(b=0;b<h;b++)printf(maze[a][b]?"#":" ");printf("\n");}}最后,迷宫寻路找到出口,其算法见源代码。

数据结构课程设计_迷宫问题

数据结构课程设计_迷宫问题

课程设计(论文)任务书软件学院软件工程+电子商务2009 专业 2 班一、课程设计(论文)题目迷宫问题二、课程设计(论文)工作自 2010年 12月 27日起至 2011年 1月 2 日止三、课程设计(论文) 地点: 创新大楼实训中心四、课程设计(论文)内容要求:1.本课程设计的目的(1)巩固和加深对数据结构基本知识的理解,提高综合运用课程知识的能力。

(2)使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。

(3)使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。

2.课程设计的任务及要求1)基本要求:(1)对系统进行功能模块分析、控制模块分析;(2)系统设计要能完成题目所要求的功能;(3)编程简练,可用,尽可能的使系统的功能更加完善和全面;(4)说明书、流程图要清楚;(5)提高学生的论文写作能力;(6)特别要求自己独立完成;2)创新要求:在基本要求达到后,可进行创新设计,如改善算法性能、友好的人机界面。

3)课程设计论文编写要求(1)要按照书稿的规格打印与写课程设计论文(2)论文包括目录、正文、小结、参考文献、附录等(3)课程设计论文装订按学校的统一要求完成4)课程设计进度安排内容天数地点构思及收集资料 1 图书馆编码与调试 3 实验室撰写论文 1 图书馆、实验室学生签名:20011 年1 月3日课程设计(论文)评审意见(1)基本算法(20分):优()、良()、中()、一般()、差();(2)设计分析(20分):优()、良()、中()、一般()、差();(3)调试分析(20分):优()、良()、中()、一般()、差();(4)论文内容(20分):优()、良()、中()、一般()、差();(5)答辩分析(20分):优()、良()、中()、一般()、差();(6)格式规范性及考勤是否降等级:是()、否()评阅人:职称:讲师2011 年1月4日目录一、需求分析 (1)二、概要设计 (2)三、详细设计 (5)四、调试分析及测试 (15)五、个人工作及创新 (18)六、小结 (19)参考文献 (20)一、需求分析1.选题理由本次课设我选择了迷宫问题,迷宫求解是数据结构课程的一个经典问题,迷宫问题要求寻找一条从入口到出口的路径。

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

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

数据结构课程设计-迷宫问题正文:一、引言本文档旨在设计一个解决迷宫问题的数据结构课程项目。

迷宫问题是一个典型的寻路问题,要求从起点出发,在迷宫中找到一条路径到达终点。

迷宫由多个房间组成,这些房间之间通过门相连。

二、问题描述迷宫问题包含以下要素:1.迷宫的拓扑结构:迷宫由多个房间和门组成,每个房间有四面墙壁,每面墙壁可能有门或者是封闭的。

迷宫的起点和终点是预先确定的。

2.寻路算法:设计一个算法,在迷宫中找到一条从起点到终点的路径。

路径的选择标准可以是最短路径、最快路径或者其他约束条件。

3.可视化展示:实现一个可视化界面,在迷宫中展示起点、终点、路径,用于直观地演示解决方案。

三、设计思路1.数据结构设计:选择合适的数据结构来表示迷宫和路径,例如使用二维数组或者图来表示迷宫的拓扑结构,使用栈或队列来辅助寻路算法的实现。

2.寻路算法设计:可以使用深度优先搜索、广度优先搜索、Dijkstra算法、A算法等经典算法来实现寻路功能。

根据实际需求选择最合适的算法。

3.可视化展示设计:使用图形界面库(如Tkinter、Qt等)创建迷宫展示窗口,并实时更新迷宫的状态、路径的变化。

可以通过颜色、动画等方式增加交互性。

四、实现步骤1.创建迷宫:根据预设的迷宫大小,使用数据结构来创建对应的迷宫数据。

2.设定起点和终点:在迷宫中选择起点和终点的位置,将其标记出来。

3.寻路算法实现:根据选择的寻路算法,在迷宫中找到一条路径。

4.可视化展示:使用图形界面库创建窗口,并将迷宫、起点、终点、路径等信息展示出来。

5.更新迷宫状态:根据算法实现的过程,实时更新迷宫中的状态,并将路径显示在迷宫上。

附件:1.代码实现:包含迷宫创建、寻路算法实现和可视化展示的源代码文件。

2.演示视频:展示项目实际运行效果的视频文件。

法律名词及注释:1.数据结构:指在计算机科学中定义和组织数据的方式和方式的基础设施。

2.寻路算法:用于解决寻找路径的问题的算法。

数据结构课程设计报告——可视化走迷宫游戏

数据结构课程设计报告——可视化走迷宫游戏

可编辑修改西安建筑科技大学 课程设计(论文)题 目: 院 (系): 专业班级: 姓 名: 学 号: 指导教师:可视化走迷宫游戏2011 年 9 月 15 日欢迎下载可编辑修改西安建筑科技大学课程设计(论文)任务书专业班级: 计算机901 学生姓名: 指导教师(签名):一、课程设计(论文)题目走迷宫游戏:程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的 右下方有一个粮仓。

游戏的任务是使用键盘上的方向键操纵老鼠在规定的时间内走到 粮仓处。

二、本次课程设计(论文)应达到的目的数据结构是实践性很强的课程。

课程设计是加强学生实践能力的一个强有力手 段。

课程设计要求学生在完成程序设计的同时能够写出比较规范的设计报告。

严格实 施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训 练,将起到显著的促进作用。

本题目要达到目的:熟练掌握最短路径的算法设计。

三、本次课程设计(论文)任务的主要内容和要求(包括原始数据、技术 参数、设计要求等)1、 老鼠形象可辨认,可用键盘操纵老鼠上下左右移动; 2、 迷宫的墙足够结实,老鼠不能穿墙而过; 3、 正确检测结果,若老鼠在规定时间内走到粮仓处,提示成功,否则提示失败; 4、 添加编辑迷宫功能,可修改当前迷宫,修改内容:墙变路、路变墙; 找出走出迷宫的所有路径,以及最短路径。

四、应收集的资料及主要参考文献:由于本课程没有安排“课内上机”学时,因此,在课程设计之前必须自己已经上 机练习了“线性表”的基本操作。

参考文献:1. 本年级使用的教材:数据结构与算法分析(C++版)(第二版)影印版 2005.72. 数据结构与算法,科学出版社,2005.08;赵文静 祁飞等编著 3. 数据结构-C++语言描述,西安交通大学出版社,1999.01,赵文静编著 4. 《Visual C++编程实例》(任意一本此类书籍)五、审核批准意见教研室主任(签字)欢迎下载可编辑修改摘要本设计是为了实现一个可视化迷宫,以及利用最短路径算法 寻找迷宫的出路以及将最短路径打印在屏幕上,并且限制小老鼠 不能穿越墙,只能在路径上移动。

迷宫程序论文

迷宫程序论文

目录:1.引言 (1)2.总体设计: (1)3.算法分析: (5)4.源程序: (12)5.运行结果: (20)6.遇到问题及解决办法 (23)7.参考文献: (25)迷宫游戏程序设计1.引言迷宫游戏是智力游戏的一种。

它不仅有趣好玩,而且还锻炼玩家的思维能力。

迷宫游戏是一种考验人多方面能力的游戏,它对心智的要求相当高。

包括综合分析能力,对时空的感知能力,还有心理的抗压能力。

是一种能多方面训练综合素质的智力游戏。

用c语言编写迷宫程序。

为简化问题,我们通过对迷宫程序问题的分析,将编写迷宫游戏程序问题,分解为生成迷宫地图、寻找迷宫路径、迷宫游戏三个小问题来解决。

迷宫由墙和道路两种元素组成。

运用c语言的随机数生成函数,来随机生成迷宫的墙和道路。

用递归调用函数求解迷宫的路径。

最后根据得到的迷宫地图,生成迷宫游戏。

关键词:随机数迷宫路径迷宫游戏2.总体设计:运用c语言编写迷宫游戏程序,我们小组根据对迷宫游戏程序的分析。

发现要编写迷宫游戏程序,主要要解决以下几个问题:1.运用c语言随机数生成函数生成迷宫地图。

2.判断随机生成的迷宫地图是否存在通路。

3.如何实现迷宫游戏。

针对这三个问题,我们小组决定将迷宫游戏程序分为迷宫的生成、路径的寻找、迷宫游戏三大主要模块来分别进行编写。

1.迷宫地图的生成:在这个游戏程序中,我们设计的迷宫地图的大小是可以调节的,可以根据玩家输入迷宫地图的长度大小n的不同,而产生不同大小的迷宫地图。

为了保证迷宫地图有唯一的入口和出口,我们设计地图时,将迷宫的入口设计在地图的左上角,迷宫的出口设计在地图的右下角。

除入口和出口的位置外,其它地图边界用“墙”来围住,这样就能保证迷宫有唯一的入口和出口。

在生成迷宫地图时由于是使用随机数生成的,迷宫不一定有通路的存在,这时就要求我们重新随机生成迷宫地图,直到生成有通路的迷宫地图为止。

而每次生成迷宫地图时,迷宫地图的边界是不变的。

所以为了节约计算机资源、优化程序,我们将迷宫地图的生成分为了迷宫边框生成和迷宫的生成两部分。

迷宫问题课程设计论文

迷宫问题课程设计论文

摘要本课题主要研究在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。

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

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

合肥学院计算机科学与技术系课程设计报告2009 ~2010 学年第二学期课程数据结构与算法课程设计名称迷宫问题学生名称韩非专业班级08计本(2)班指导教师王昆仑张贯虹2010年6月一、课程设计名称及内容名称:迷宫问题内容:生成一个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)可以选用深度优先算法或广度优先算法实行,迷宫可由自动或手动生成。

测试用例应该包含有解迷宫和无解迷宫。

二、问题分析本程序要求实现迷宫问题的相关操作,包括迷宫的组织和存储,并实现迷宫路由算法(即查找迷宫路径)。

程序所能达到的:具体包括迷宫的建立,迷宫的存储(迷宫由自动生成或手动生成),迷宫中路径的查找迷宫是一个矩形区域,迷宫存在一个入口和一个出口,其内部包含了不能穿越的墙或者障碍。

迷宫的建立即是建立这样一个迷宫矩阵,用于存储迷宫信息,包括可穿越的路和不可穿越的墙或者障碍,分别用0表示通路,1表示障碍。

对于迷宫矩阵,用m×n的矩阵来描述,m和n分别代表迷宫的行数和列数。

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

从入口到出口的路径是由一组位置构成的。

每个位置上都没有障碍,且每个位置(第一个除外)都是前一个位置的上、下、左、右的邻居。

为了描述迷宫中位置(i ,j)处有无障碍,规定,当位置(i ,j)处有一个障碍时,其值为1,否则为0.这样迷宫就可以用0、1矩阵来描述,在构造矩阵时,为了操作方便会将矩阵四周置为1(不通)。

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

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

数据结构课程设计报告设计题目:迷宫问题数据结构课程设计_班级:计科 152学号:姓名:徐昌港南京农业大学计算机系数据结构课程设计报告内容一.课程设计题目迷宫问题以一个 m*n 的长方阵表示迷宫, 0 和 1 分别表示迷宫中的通路和障碍。

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

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

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

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

二.算法设计思想1.需求分析(1)迷宫数据用一个二维数组int maze[row][col] 来存储,在定义了迷宫的行列数后,用两个 for 循环来录入迷宫数据,并在迷宫周围加墙壁。

(2)迷宫的入口位置和出口位置可以由用户自己决定。

2.概要设计( 1)主程序模块:void main(){int maze[row][col];struct mark start,end;细设计( 1)坐标位置类型struct mark{int a,b;换个方向搜索是( 1)built本程maze initstack初始化链栈,定义方向二是否维数组并将push入口stack,出口主程序main()坐标移动此坐标此此坐栈坐标是标周是否信围否为息有为空是无障碍入出栈口栈逆置并输出否路线信息入栈当前坐标周围是否有结束户使用说明pop 是stack_empty 删除栈中迷否宫无出路序的运行环境此步信息为debug运行环境,执行文件为:.cpp;方向可以探索( 2)用 VC++运行文件后出现以下窗口:点击运行程序( 3)出现以下窗口后输入迷宫的行列数,回车;再继续输入迷宫的数据,1表示障碍,0 表示通路;再输入入口坐标和出口坐标,回车。

就可以显示出迷宫路径。

2.测试结果(1)输入行列数: 5,5输入迷宫数据为:出口位置: 1,1出口位置: 5,500011 11011 00010 01100 00000(2)输入行列数: 4,9输入迷宫数据为: 000000100010001000001110011001110100输入入口坐标: 1,1输入出口坐标: 4,9(3)输入行列数: 9,8输入迷宫数据为: 001000100010001000001101011100100001000001000101011110011100010111000000输入入口坐标: 1,1输入出口坐标: 9,83.调试分析(1)在刚开始写完代码后,运行发现程序只能运行简单的一条直线的迷宫,在运行复杂的迷宫时,不会碰到死路(周围没有可探索的道路)就删除坐标往回到前坐标换方向探索。

迷宫问题系统的设计与实现

迷宫问题系统的设计与实现

迷宫问题的设计与实现1.问题描述以一个m×n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。

本程序主要是对任意给定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。

2.需求分析1.迷宫的建立:迷宫中存在通路和障碍,为了方便迷宫的创建,可用0表示通路,用1表示障碍,这样迷宫就可以用0、1矩阵来描述。

2.迷宫的存储:迷宫是一个矩形区域,可以使用二维数组表示迷宫,这样迷宫的每一个位置都可以用其行列号来唯一指定,但是二维数组不能动态定义其大小,我们可以考虑先定义一个较大的二维数组maze[M+2][N+2],然后用它的前m行n列来存放元素,即可得到一个m×n的二维数组,这样(0,0)表示迷宫入口位置,(m-1,n-1)表示迷宫出口位置。

注:其中M,N分别表示迷宫最大行、列数,本程序M、N的缺省值为39、39,当然,用户也可根据需要,调整其大小。

3.迷宫路径的搜索:首先从迷宫的入口开始,如果该位置就是迷宫出口,则已经找到了一条路径,搜索工作结束。

否则搜索其上、下、左、右位置是否是障碍,若不是障碍,就移动到该位置,然后再从该位置开始搜索通往出口的路径;若是障碍就选择另一个相邻的位置,并从它开始搜索路径。

为防止搜索重复出现,则将已搜索过的位置标记为2,同时保留搜索痕迹,在考虑进入下一个位置搜索之前,将当前位置保存在一个队列中,如果所有相邻的非障碍位置均被搜索过,且未找到通往出口的路径,则表明不存在从入口到出口的路径。

这实现的是广度优先遍历的算法,如果找到路径,则为最短路径。

3.概要设计因为迷宫可行路径之间存在线性关系,并且需要在端点处进行增删操作,因此采用队列结构类型存储迷宫可行路径的信息。

下面给出队列结构的ADT的定义。

3.1 队列结构的ADT的定义ADT Queue{数据对象:D={a i|a i∈ElemSet,t=1,2……,n, n>=0}数据关系:R1={<a i-1,a i>|a i-1,a i∈D,i=2,……,n}基本操作:InitQueue(&Q)操作结果:创建一个空队列QDestroy Queue (&Q)初始条件:队列Q已存在操作结果:队列Q被销毁ClearQueue(&Q)初始条件:队列Q已存在操作结果:队列Q清为空栈QueueEmpty(Q)初始条件:队列Q已存在操作结果:若队列Q为空栈,则返回TRUE,否则FALSEQueueLength(Q)初始条件:队列Q已存在操作结果:返回Q的元素个数,即队列的长度GetHead(Q,&e)初始条件:队列Q已存在且非空操作结果:用e返回Q的队头元素EnQueue(&Q,e)初始条件:队列Q已存在操作结果:插入元素e为新的队尾元素DeQueue(&Q,&e)初始条件:队列Q已存在且非空操作结果:删除Q的队头元素,并用e返回其值QueueTraverse(Q,visit() )初始条件:队列Q已存在且非空操作结果:从队头到队尾依次对Q的每个数据元素调用函数visit()。

迷宫问题课程设计报告

迷宫问题课程设计报告

南华大学计算机科学与技术学院课程设计报告(2007 ~ 2008 学年度第1学期)课程名称数据结构c++描述迷宫问题课程设计名称姓名罗丹学号20064440109专业计算机科学班级计算机01班与技术地点8—209 教师刘霞1.实验目的及要求1)、设计目标(问题描述)迷宫问题问题描述:迷宫实验是取自心理学的一个古典实验。

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

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

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

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

2)、功能设计要求编写一个程序求解迷宫问题。

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

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

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

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

算法要点:创建迷宫,试探法查找路径,输出解3)、实验目的1、加深对栈特性理解,以便在解决实际问题中灵活运用它们2、加深对栈操作实际算法的理解3、进一步熟悉掌握链表的操作;4、掌握指针的应用5、更进一步掌握有关类的操作4)、需求分析1、本程序实现迷宫的探索过程. 以用户和计算机对话的方式,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,然后程序就探索路径并输出路径。

2、本演示程序中,输入形式以“回车符”为结束标志,且允许出现重复字符。

3、利用二维指针实现迷宫位置的存储,并用栈存贮探索路径,每个结点含三个整形变量。

输入的形式以回车结束。

4、本程序中,用户可以读去文件里的迷宫,也可自己重新输入迷宫,而且用户可以输入任意大小的迷宫,然后程序自动探索路径,并输出迷宫的路径5)、创新(见源程序附录)6)、软件、硬件环境软件环境:Microsoft Windows Xp Processional2002 ServiceMicrosoft Visual C++6.0硬件环境:cpu:AMD Athlon(tm)64x DualProcessor 3800+2.01GHz Main memory:960MB2.实验步骤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 退出程序根据结果分析:利用栈求得的路径不一定是最短路径,而用队列求得的路径是最短路径。

相关文档
最新文档