ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:214.04KB ,
资源ID:8222036      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8222036.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(迷宫问题课程设计报告.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

迷宫问题课程设计报告.docx

1、迷宫问题课程设计报告一、课程设计名称及内容名称:迷宫问题内容:生成一个NM(N行M列)的迷宫,完成迷宫的组织和存储,并实现迷宫路由算法。基本要求1、 N和M是用户可配置的,缺省值为50和50。2、迷宫的入口和出口分别在左上角和右下角。 提示:(1)可以使用二维数组mazeM+2N+2表示迷宫,其中M,N为迷宫的行、列数,当元素值为0时表示该点是通路,当元素值为1时表示该点是墙。老鼠在每一点都有4种方向可以走,可以用数组move4来表示每一个方向上的横纵坐标的偏移量,可用另一个二维数组markM+2N+2记录节点的访问情况。(2)可以选用深度优先算法或广度优先算法实行,迷宫可由自动或手动生成。测

2、试用例应该包含有解迷宫和无解迷宫。二、问题分析本程序要求实现迷宫问题的相关操作,包括迷宫的组织和存储,并实现迷宫路由算法(即查找迷宫路径)。程序所能达到的:具体包括迷宫的建立,迷宫的存储(迷宫由自动生成或手动生成),迷宫中路径的查找迷宫是一个矩形区域,迷宫存在一个入口和一个出口,其内部包含了不能穿越的墙或者障碍。迷宫的建立即是建立这样一个迷宫矩阵,用于存储迷宫信息,包括可穿越的路和不可穿越的墙或者障碍,分别用0表示通路,1表示障碍。对于迷宫矩阵,用mn的矩阵来描述,m和n分别代表迷宫的行数和列数。这样,则迷宫中的每个位置都可以用其行号和列号来指定。从入口到出口的路径是由一组位置构成的。每个位置

3、上都没有障碍,且每个位置(第一个除外)都是前一个位置的上、下、左、右的邻居。为了描述迷宫中位置(i ,j)处有无障碍,规定,当位置(i ,j)处有一个障碍时,其值为1,否则为0.这样迷宫就可以用0、1矩阵来描述,在构造矩阵时,为了操作方便会将矩阵四周置为1(不通)。对于查找迷宫路由问题首先,考察,迷宫的入口位置,如果该位置就是迷宫出口,则已经找到了一条路径,搜索工作结束。否则,考察其上、下、左、右位置上的邻居是否是障碍,若不是就移动到这个相邻位置上,然后对于这个位置开始搜索通往出口的路径。如果不成功,就选择另一个相邻的位置,并从它开始搜索路径。为防止搜索出现重复,则将已搜索过的位置标记为1。同

4、时为保留过搜索的痕迹,在考察相邻位置之前,将当前位置保存在一个堆栈中,如果所有相邻的非障碍位置均被搜索过,且未能找到通往出口的路径,则表明不存在从入口到出口的路径。且对于此,实现的是深度优先遍历算法,如果查找到路径,则为从入口到出口的路径。下面实现如何利用堆栈实行深度优先遍历算法进行迷宫最短路径的查找。以矩阵 1 1 1 1 1 1 11 0 0 1 0 1 1 1 1 0 0 1 0 1 1 1 0 0 0 1 1 1 0 0 1 0 0 1 1 1 1 1 1 1 1首先,将位置(1,1)放入堆栈中,从它开始搜索,标记。由于其只有一个非障碍位置,所以接下来移动到(1,2),防止稍后的搜索再

5、经过这个位置。从(1,2)移动到(2,2),放入堆栈中,(2,2)存在(2,3)、(3,2)两个可移动位置。标记已被搜索过,对于每一个非障碍位置,它的相邻非障碍节点均入队列,实现了深度优先遍历算法。所以如果存在路径,则从出口处节点的位置,逆序则可以找到其从出口到入口的通路。实现了查找路径。宫路由算法流程图: N N Y YY NY N Y N Y N 图1迷宫路由算法流程图1、数据输入形式和输入值的范围:生成迷宫时可选择手动或者自动生成;手动输入迷宫矩阵时以0 表示无障碍为通路,1 表示该点有障碍为墙。所有输入中,元素的值均为整数。2、结果的输出形式:当完成迷宫生成后,会提示输入入口与出口,进

6、入迷宫路由查找算法,如找到出口,则打印出路径矩阵坐标,并显示显示迷宫生成图形3、测试数据:a、进入界面,选择2,自动生成b、输入入口与出口c、查看结果三、概要设计 1、为了实现上述功能,需要:构造一个二维数组mazeM+2N+2用于存储迷宫矩阵,构造一个二维数组backupM+2N+2用于备份迷宫矩阵;自动或手动生成迷宫,即为二维数组mazeM+2N+2赋值并备份;将构造一个堆栈用于存储迷宫路由;建立迷宫节点struct Mlink,用于存储迷宫中每个访问过的节点。实现迷宫路由算法,用深度优先遍历实现查找迷宫路径。如找到路径则显示路径,否则提示无通路。同时显示生成迷宫。在屏幕上显示操作菜单。2

7、、本程序包含6 个函数:( 1 )主函数 main( )( 2 )生成迷宫函数 create( )( 3 )打印迷宫矩阵与图形函数prin( ) ( 4 )寻找迷宫路由Mazepath( ) ( 5 )输出迷宫通路坐标printonglu1( ) ( 6 )输出迷宫生成图形printonglu2( ) 各函数之间的关系如下图(图2)所示: 函数关系图:create( ) prin( )main() Mazepath( )printonglu1( )printonglu2( )图 2各函数间关系图四、详细设计 实现概要设计中定义的所有数据类型,对各个操作给出伪代码算法。对于主程序和各个模块也给出

8、相应的伪代码算法。1、 节点类型和指针类型迷宫矩阵类型:Mlink *stack; 全局变量堆栈,存储迷宫通路int abcM+2N+2 辅助数组int mazeM+2N+2; 迷宫矩阵int backupM+2N+2; 备份矩阵,便于操作,定义为全局变量 迷宫中节点类型及队列类型:struct Mlink int row ,col ; struct node * next; Mlink;2、 迷宫的操作(1)生成迷宫void create(int mazeN+2)定义变量i,j,flag;srand( (unsigned)time( NULL ) ) 以时间产生随机种子利用for初始化迷宫矩

9、阵与备份矩阵,包括边界全置为1利用for将迷宫置为0选择迷宫生成方式1为手动生成,2为自动生成,输入值并赋给flagflag=1以i , j 控制迷宫中行列数的循环输入以0 表示通路,以1 表示障碍,给mazeij赋值,不包括边界。循环结束,完成迷宫生成flag=2定义变量i1,j1用以接收随机值以i , j 控制迷宫中行列数的循环赋值操作以0 表示通路,以1 表示障碍用for(c=1;c=M*N;c+) i1=(int)(rand()%M)+1; j1=(int)(rand()%N)+1; mazei1j1=int(rand()%2); 随机定位矩阵一点,给mazei1j1赋一个随机值,这样

10、可以增加迷宫通路的概率,循环结束,完成迷宫生成以i , j 控制迷宫中行列数的循环赋值操作,将maze备份到backup;(2)打印迷宫矩阵与字符图形void prin(int mazeN+2)此函数主要用于将迷宫矩阵显示出来定义变量i,j,z;for(z=1;z=N;z+) if(z10) printf(%d ,z); else printf(%d,z); 此语句用来标明列号用 for 控制循环 在第一重循环里,使用语句printf(n); if(inext(5)输出迷宫通路的字符图形void printonglu2()此函数根据堆栈内栈顶与“次栈顶”的位置关系决定输出字符,或,其中2=,3

11、=,4=,5=所有的操作都是在备份矩阵backup上。出口位置输出int i,z,j;Mlink *p=stack;p不空if(p-rowp-next-row) backupp-next-rowp-next-col=5; 下一位置在下else if(p-rownext-row) backupp-next-rowp-next-col=2;下一位置在上else if(p-colp-next-col) backupp-next-rowp-next-col=4;下一位置在右else ;下一位置在左利用for循环,i,j为循环控制变量输出备份矩阵backup为0是输出“”为1是输出“”为2是输出“”为3

12、是输出“”为4是输出“”为5是输出“”为6是输出“”另外在输出语句上,与矩阵输出相同,标明了行号与列号(该功能为王教授所要求而后加的) 3、 主函数void menu()定义迷宫数组矩阵mazeM+2N+2定义辅助数组abcM+2N+2 以用来在可以在第一次产生迷宫中重复选择入口与出口定义变量k以用来控制循环 定义整型变量 x1,y1 ,用于存储入口。定义整型变量 x2,y2 ,用于存储出口。定义整型变量x用于接收mazepash的返回值。输入入口与出口。如果x=1则条用函数printonglu1();printonglu2();否则提示无通路。界面开始会显示:1,手动建立2,自动建立按提示操

13、作,输入入口与出口,回车即会看到结果五、调试分析在调试过程中,开始用堆栈实现了路径的查找并调试成功,但输出的结果仅仅只是路径坐标,看起来不形象,于是想到了用字符来表示图形并标出通路,虽然不是太完美,但比之之前好好多了在实现这一算法过程,注意将访问过的节点进行标记,并且在遍历过程中对矩阵数组是“破坏性”遍历,在算法完成后,矩阵已被破坏,堆栈中会存用路径,为了再原矩阵中用字符图形表示出通路,在建立矩阵后会迷宫矩阵备份一下,当然或许会有更好的处理方法。六、使用说明程序名为迷宫.exe,运行环境为DOS,程序执行后显示:建立迷宫矩阵(选择1或者2):1,手动建立2,自动建立进请输入您的选择:在输入选择

14、后输入数字选择执行不同的迷宫建立。按要求输入入口与出口七、测试结果1主页面 图3 主页面2选择自动建立 图4 迷宫自动生成中3,自动生成迷宫,上面为数组矩阵,其中0可通,1障碍。下面为字符图形,其中白色可通,黑色障碍, 图5 打印出的迷宫矩阵与迷宫图形4,根据提示输入入口与出口 图6 输入入口与出口5,回车后输出路径 图7 打印出的迷宫路径6,输入一个非“0”继续 图8 输入非“0”继续走该迷宫7,输入入口与出口,无通路 图9 无通路八、参考文献 1 王昆仑,李红. 数据结构与算法. 北京:中国铁道出版社,2007年6月。附录:源代码:#includeiostream#includestdio

15、.h#includetime.h#includemalloc.h#define M 20#define N 20typedef struct node/堆栈结构 int row; /行 int col; /列 struct node * next;Mlink;Mlink *stack;/定义一个栈int backupM+2N+2; /备份数组/*建立迷宫矩阵*/void create(int mazeN+2)/建立迷宫 int i,j,flag; srand( (unsigned)time( NULL ) ); /以时间产生随机种子 for(i=0;i=M+1;i+) for(j=0;j=N+

16、1;j+) mazeij=1;/将四周置为1 for(i=1;i=M;i+) for(j=1;j=N;j+) mazeij=0;/初始化矩阵 backupij=0;/初始化备份矩阵 printf(建立迷宫矩阵(选择1或者2):n1,手动建立n2,自动建立n请输入您的选择:n); scanf(%d,&flag); if(flag=1)/手动建立迷宫 printf(手动建立迷宫矩阵(0表示可通1表示障碍):n); for(i=1;i=M;i+) for(j=1;j=N;j+) scanf(%d,&mazeij); if(flag=2) /自动建立迷宫 int c,i1,j1; for(c=1;c=

17、M*N;c+) /矩阵初始为“0”,随机选择位置赋予一个随机的0或1, i1=(int)(rand()%M)+1; j1=(int)(rand()%N)+1; mazei1j1=int(rand()%2); /随机矩阵 按照王教授的要求这样可以产生更多的“0”即通路 printf(自动生成中n); system (pause); for(i=1;i=M;i+) for(j=1;j=N;j+) backupij=mazeij;/备份数组矩阵/*华丽的分割线*/*打印迷宫矩阵*/void prin(int mazeN+2) int i,j; printf(迷宫矩阵如下(0可通):n ); int

18、z; for(z=1;z=N;z+) /在矩阵上方标明列号 if(z10) printf(%d ,z); else printf(%d,z); for(i=1;i=M;i+) printf(n); if(i10) printf(%d ,i); /矩阵左方标明行号 else printf(%d,i); for(j=1;j=N;j+) printf(%d ,mazeij); printf(n迷宫图形如下(白色可通):n); printf( ); for(z=1;z=N;z+) /在图形上方标明列号 if(z10) printf(%d ,z); else printf(%d,z); for(i=1;

19、i=M;i+) printf(n); if(i10) printf(%d ,i); /矩阵左方标明行号 else printf(%d,i); for(j=1;jrow=x1; p-col=y1; p-next=NULL; stack=p; /将入口放入堆栈 mazestack-rowstack-col=1;/标志入口已访问 while(!(stack-row=NULL&stack-col=NULL)&(!(stack-row=x2&stack-col=y2)/未找到出口并且堆栈不空 if(mazestack-rowstack-col+1=0)/下面位置可通 p=(Mlink *)malloc(

20、sizeof(Mlink); p-row=stack-row; p-col=stack-col+1; p-next=stack; /入栈 stack=p; mazestack-rowstack-col=1;/标记已访问 else if(mazestack-rowstack-col-1=0)/上面可通 p=(Mlink *)malloc(sizeof(Mlink); p-row=stack-row; p-col=stack-col-1; p-next=stack; /入栈 stack=p; mazestack-rowstack-col=1;/标记已访问 else if(mazestack-row

21、+1stack-col=0)/右面可通 p=(Mlink *)malloc(sizeof(Mlink); p-row=stack-row+1; p-col=stack-col; p-next=stack; /入栈 stack=p; mazestack-rowstack-col=1;/标记已访问 else if(mazestack-row-1stack-col=0)/左面可通 p=(Mlink *)malloc(sizeof(Mlink); p-row=stack-row-1; p-col=stack-col; p-next=stack; /入栈 stack=p; mazestack-rowst

22、ack-col=1;/标记已访问 else /不可通 返回上一点 if (stack-next!=NULL)/堆栈里布置一个顶点则出栈并返回循环 p=stack; stack=stack-next; /出栈 free(p); /释放空间 else /堆栈里只有一个顶点即入口,此时若释放空间出栈会使循环 /控制语句无法比较(因为stack-col,stack-row都已不存在,) stack-row=NULL; stack-col=NULL; stack-next=NULL; if (stack-row=x2&stack-col=y2) return (1); else return (0);

23、else return(0);/*输出坐标通路*/void printonglu1() Mlink *q; printf(其中的一条通道为:n); q=stack; printf(出口-); while (q!=NULL) printf(%d%3d)row,q-col); q=q-next; printf(入口n);/*分割线*/*输出图形通路*/2时输出,3时输出,4时输出,5时输出void printonglu2() printf(图形通路如下:n); int z; printf( ); for(z=1;z=N;z+) /图形上方标明列号 if(zrowp-col=6; while (p-next!=NULL) if(p-next-col!=NULL) if( p-row p-next-row ) backupp-next-rowp-next-col=5;/下一节点在下 else if(p-rownext-row) backupp-next-rowp-next-col=2;/下一节点在上 else if(p-colp-next-col) backupp-next-rowp-next-col=4;/下一节点在右 else backupp-next-rowp-

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1