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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

本文(迷宫问题课程设计报告.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至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、以用其行号和列号来指定。(0,0)表述入口位置,(m-1,n-1)表示出口位置;从入口到出口的路径是由一组位置构成的。每个位置上都没有障碍,且每个位置(第一个除外)都是前一个位置的上、下、左、右的邻居。为了描述迷宫中位置(i ,j)处有无障碍,规定,当位置(i ,j)处有一个障碍时,其值为1,否则为0.这样迷宫就可以用0、1矩阵来描述。对于查找迷宫路由问题首先,考察,迷宫的入口位置,如果该位置就是迷宫出口,则已经找到了一条路径,搜索工作,结束。否则,考察其上、下、左、右位置上的邻居是否是障碍,若不是就移动到这个相邻位置上,然后对于这个位置开始搜索通往出口的路径。如果不成功,就选择另一个相邻的位

4、置,并从它开始搜索路径。为防止搜索出现重复,则将已搜索过的位置标记为2。同时为保留过搜索的痕迹,在考察相邻位置之前,将当前位置保存在一个队列中,如果所有相邻的非障碍位置均被搜索过,且未能找到通往出口的路径,则表明不存在从入口到出口的路径。且对于此,实现的是广度遍历优先算法,如果查找到路径,则为从入口到出口的最短路径,而使用深度优先遍历则可以查找到路径,但未必是最短路径。下面实现如何利用队列实行广度优先遍历算法进行迷宫最短路径的查找。以矩阵 0 0 1 0 1 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0首先,将位置(0,0)(序列号0)放入队列中,其前节点为空,从它开始搜索,标记

5、。由于其只有一个非障碍位置,所以接下来移动到(0,1)(序列号1),其前节点序列号为0,防止稍后的搜索再经过这个位置。从(0,1)移动到(1,1)(序列号2),放入队列中,其前节点序列号为1,(1,1)存在(1,2)(序列号3)、(2,1)(序列号4)两个可移动位置,其前序列号均为2。标记已被搜索过,对于每一个非障碍位置,它的相邻非障碍节点均入队列,实现了广度优先遍历算法,且它们的前序列号均为该位置的序列号。所以如果存在路径,则从出口处节点的位置,逆序则可以找到其从出口到入口的通路。实现了查找最短路径。(如表格1所示为所建队列)将(0,0)入队列判断首节点是否为通路路判断队列否为空左边是否存在

6、通路下边是否存在通路右边是否存在通路上边是否存在通路是否到达迷宫出口处将队头出队 存储节点,将节点入队列迷宫路由算法流程图: N 循环结束无解迷宫 Y NN Y 有解迷宫 循环结束图1迷宫路由算法流程图表1 图示队列表 0 1 2 3 4 5 6 7 8 9 10(0,0)(0,1)(1,1) (1,2)(2, 1)(2,2)(1, 3)(2,3)(0,3)(3,3)(3,4)-10122345679由此可看出,从(3,4)-(3,3)-(2,3)-(2,2)-(1,2)-(1,1)-(0,1)-(0,0)得到最短路径。1、数据输入形式和输入值的范围:生成迷宫时须输入迷宫的行数和列数,其最大值

7、均不应超过50;手动输入迷宫矩阵时以0 表示无障碍为通路,1 表示该点有障碍为墙。所有输入中,元素的值均为整数。2、结果的输出形式:所有进入界面中,只有当输入正确(如密码正确或输入值在可操作范围内)时才可进入下一界面,否则均不可进入下一届面操作,当完成迷宫生成后,进入迷宫路由查找算法,输出查找的每次循环过程,及最终查找结果:如找到,则显示路径(表述);否则显示为查找到。显示迷宫生成图形(如有路径则同样显示路径结果)。3、测试数据:a、在输入密码中 输入13 ,输入1234b、在输入行、列数中:输入5、56, 输入5 、5 c、在输入选择自动生成或手动生成中,选择相应操作,查看结果d、选择输入3

8、,重新输入矩阵的行列数。e、选择是否循环执行此程序。(-1表示输入结束) 三、概要设计 1、为了实现上述功能,需要:构造一个二维数组mazeM+2N+2用于存储迷宫矩阵;自动或手动生成迷宫,即为二维数组mazeM+2N+2赋值;将构造一个队列用于存储迷宫路由;建立迷宫节点struct point,用于存储迷宫中每个节点的访问情况。实现迷宫路由算法,用广度优先遍历实现查找迷宫最短路径。如找到路径则显示路径,否则显示为查找到。同时显示生成迷宫。在屏幕上显示操作菜单。2、本程序包含 12 个函数:( 1 )主函数 main( )( 2 )手动生成迷宫函数 shoudong_maze( )( 3 )自

9、动生成迷宫函数 zidong_maze( ) ( 4 )打印每次显示结果 print_maze( ) ( 5 )显示生成迷宫 bulid_maze( ) ( 6 )显示迷宫生成图形(如有路径生成,则显示路径)result_maze( ) ( 7 )入队操作 enqueue( ) ( 8 )出队操作 dequeue( ) ( 9 )判断队列是否为空 is_empty( ) (10)访问节点 visit( ) (11 )寻找迷宫路由(求解迷宫中最短路径) mgpath( ) (12 )菜单操作 menu( ) 各函数之间的关系如下图(图1)所示: 函数关系图:shoudong_maze idong

10、_maze build_maze main menu enqueuedequeue mgpath is_empty visit print_maze result_maze 图 2各函数间关系图四、详细设计 实现概要设计中定义的所有数据类型,对各个操作给出伪代码算法。对于主程序和各个模块也给出相应的伪代码算法。1、 节点类型和指针类型迷宫矩阵类型:int mazeM+2N+2; 为方便操作使得其为全局变量迷宫中节点类型及队列类型:struct point int row ,col ;int predecessor; queue512;2、 迷宫的操作(1)手动生成迷宫 void shoudon

11、g_maze(int m ,int n) 定义变量 i,j;m 为迷宫中行数,n为迷宫中列数利用 for循环控制循环以i , j 控制迷宫中行列数的循环输入以0 表示通路,以1 表示障碍,给mazeij赋值。循环结束,完成迷宫生成 (2)自动生成迷宫void zidong_maze( int m, int n) 定义变量 i,j;m 为迷宫中行数,n为迷宫中列数以i , j 控制迷宫中行列数的循环赋值操作以0 表示通路,以1 表示障碍用 0+(int)(2*rand( )/(RAND_MAX+1.0)随机获得 0 、1 ,给mazeij赋值,循环结束,完成迷宫生成 (3)生成迷宫打印void

12、print_maze( int m,int n) 此函数主要用于将迷宫路由算法中每次操作结果显示出来 定义变量,用 for 控制循环 以 i, j 控制迷宫中行列数的循环操作,将mazeij显示出来 (4)出示时显示迷宫生成结果void build_maze(int m,int n) 首先进行清屏,打出屏幕提示信息,显示迷宫入口和出口,调用函数print_maze()(5)迷宫生成图形的显示操作void result_maze(int m, int n) 定义整型变量i,j;用 i,j 控制迷宫行列数的循环操作,显示迷宫图形。在循环中,如果迷宫中为通路,(即mazeij=0或2)则显示 “ ”

13、;如果迷宫中为障碍 (mazeij=1),则显示“”,如果有最短路径(mazeij=3)则显示“”。(6)迷宫求解路由求解操作迷宫中队列入队操作 void enqueue( struct point p) 将p放入队尾tail ,将tail加1迷宫中队列出队操作 struct point dequeue( ) head 加1; 返回 queue 的队头head-1判断队列是否为空 int is_empty( ) 返回 head=tail值,即当队列为空时,返回0值;访问矩阵中某一个节点 void visit(int row, int col, int maze5252)建立新的队列节点 vis

14、it_point,将其中的值分别赋为 row, col,head-1;head-1表示前一个可以走的通路的位置。将mazerowcol=2,表示该节点已被访问过;调用enqueue(visit_point);将该节点入队列;迷宫求解路径算法实现函数int mgpath(int maze5252,int m, int n)首先定义迷宫入口处节点struct point p=0,0,-1,入口为最左上角,从maze00开始访问。如果入口处即为障碍,则此迷宫无解,返回0值;程序结束。 否则访问入口处节点,将入口处节点标记为访问过mazep.rowp.col=2,调用函数enqueue(p)将该节点入

15、队列。判断队列是否为空,如果不为空,则运行底下的操作: 调用dequeue()函数,将队头元素返回给p,如果p.row=m-1同时p.col=n-1即访问到迷宫出口处,即所有通路处全部被访问过,且找到了路径,则程序结束。如果p.col+1n同时mazep.rowp.col+1=0即未访问到超过迷宫范围的节点,同时节点p的右边有通路,则调用visit(p.row,p.col+1,maze);访问该位置,新建节点存储该位置(其p. predecessor所存储的为前一个可以被访问的可通过的通路节点的位置)并将该节点入队列,标志该节点已被访问过。如果p.col+10同时mazep.rowp.col-

16、1=0即访问未超过迷宫范围p的左边存在节点,同时该节点为通路,则调用visit(p.row,p.col-1,maze);访问该位置,新建节点存储该位置(其p. predecessor所存储的为前一个可以被访问的可通过的通路节点的位置)并将该节点入队列,标志该节点已被访问过。如果p.row-10同时mazep.rowp.col-1=0即访问未超过迷宫范围p的上边存在节点,同时该节点为通路,则调用visit(p.row-1,p.col,maze);访问该位置,新建节点存储该位置(其p. predecessor所存储的为前一个可以被访问的可通过的通路节点的位置)并将该节点入队列,标志该节点已被访问过

17、。调用函数print_maze,打印出关于p节点周围的横纵坐标的访问情况。在未访问到无通路,或者未访问到出口处时,循环执行以上程序。如果最后p.row=m-1同时p.col=n-1,访问到出口处,即找到从迷宫入口处到出口处的路径时,将迷宫路径打印出来: 首先打印出出口节点,标记其为最短路径的通路标志,mazep.rowp.col=3如果p.predecessor不等于-1,则继续打印,p=queuep.predecessor打印该节点,标记节点为最短路径通路 否则 显示此迷宫无解。返回0。3、 菜单操作void menu() 定义整型变量 m ,n ,用于控制管理迷宫的行数和列数 定义整型变量

18、 cycle ,用于控制循环,是否重复运行此程序。 定义整型变量secret_code,进入本操作界面的密码。 定义整型变量 choice,用于控制选择菜单。显示欢迎界面,输入用户密码,如果密码不正确,则显示“密码错误,请重新输入”,重新输入,只有当输入密码正确时,才进入操作界面。 清屏处理,进入操作界面。 输入迷宫的行数、列数,迷宫的行列数均不得超过50,否则显示“行列数超出预设范围,请重新输入”重新输入行、列数。 当输入行列数符合要求时,进入操作菜单栏 1-手动生成迷宫 2-自动生成迷宫 3-迷宫行列数输入有误,选择重新输入 输入选择(choice) 使用switch语句根据choice

19、选择,以下操作 case 1(如果选择的是1):执行手动生成迷宫函数 shoudong_maze(m,n);调用build_maze(m,n)显示出生成的迷宫,及其入口和出口,break。 case 2(如果选择的是 2):执行自动生成迷宫函数 zidong_maze(m,n); 调用build_maze(m,n)显示出生成的迷宫,及其入口和出口,break。 case 3(如果选择的是 3):首先进行清屏,重新输入迷宫的行列数且同样必须在可操作范围内。否则循环此操作,重新输入行列数。调用mgpath(maze,m,n),寻找迷宫路由(即迷宫路径) 调用result_maze(m,n),显示出

20、迷宫图形及路径 选择是否重新输入迷宫,如果不继续,-1退出。4、主函数 void main() system(“color f0”); /设置屏幕及字体颜色 调用菜单函数 menu(); 五、调试分析在调试过程中,首先使用的是栈进行存储,但是由此产生了,寻找到路径,但是此路径并不一定就是最短路径,所以通过比较算法,改使用广度优先遍历可以查找到最短路径。 由此可以得出使用栈不利于实现这一算法,因此改使用队列存储,查找最短路径。在实现这一算法过程,注意将访问过的节点进行标记,且注意障碍的不同设置方式对此操作的不同影响。同时注意队列中存储的是非障碍节点,但是由于广度遍历的算法,使得从出口到入口处所有

21、节点彼此相关。则在调用时注意区别。六、使用说明程序名为maze.exe,运行环境为DOS,程序执行后显示:欢迎进入用户界面请输入用户密码(注:密码为1234,方可进入用户界面,否则不可进入。)输入1234,显示密码正确。请输入行数:请输入列数:进入选择界面:1-手动生成迷宫2-自动生成迷宫3-迷宫行列数输入有误,选择重新输入请输入选择:在输入选择后输入数字选择执行不同的功能。要求输入在可操作范围内的行、列数,可执行1、2操作。执行显示迷宫每次的遍历过程。显示生成的迷宫及路径。七、测试结果1、输入密码13,输入错误,重新输入 1234 图 3 登陆界面图2、输入迷宫行、列数 5、 56,超过预设

22、范围,重新输入 5 、5 图4 输入行列数图3、进入选择界面:1进入手动输入,输入迷宫 图5初始化迷宫图4、显示输出结果 图 6 建立迷宫图 图7 结果运行图1 图8 结果运行图2 图 9结果运行图3 图10 路径查找结果图选择2进入自动生成迷宫。 图11 选择图自动生成迷宫 图12生成过程图显示输出结果 图 13 迷宫求解过程图1 图14 迷宫求解过程图2 图15 迷宫求解过程图 3 图16 迷宫求解过程图4 图17路径查找结果图八、参考文献 1 王昆仑,李红. 数据结构与算法. 北京:中国铁道出版社,2006年5月。 2 李春葆 数据结构教程 北京: 清华大学出版社 2005年1月。源代码

23、:#includeiostream#includestdlib.husing namespace std;#define N 50#define M 50int mazeN+2M+2;struct point int row, col, predecessor; queue512; /int head = 0, tail = 0;void shoudong_maze(int m,int n) / 手动生成迷宫函数 system(cls); int i,j; /控制循环变量 printf(选择手动生成迷宫n); printf(0表示通路,1表示障碍n); printf(请按行、列数,对应输入0、

24、1n); for(i=0;im;i+) for(j=0;jn;j+) scanf(%d,&mazeij); void zidong_maze(int m,int n) /自动生成迷宫函数 system(cls); int i,j; printf(自动生成迷宫n); printf(生成中n); system (pause); /暂停 for(i=0;im;i+) for(j=0;jn;j+) mazeij=0+(int)(2*rand()/(RAND_MAX+1.0); / 0、1 随机数产生,生成迷宫 void print_maze(int m,int n) /生成迷宫打印 int i,j;

25、for(i=0;im;i+) printf(n); for(j=0;jn;j+) printf(%d,mazeij); void build_maze(int m,int n) system(cls); printf(生成结果n); printf(迷宫入口n); printf(); print_maze(m,n); printf(迷宫出口n);void result_maze(int m,int n) /迷宫生成图形 int i,j; printf(迷宫生成图形如下所示:n); for(i=0;im;i+) printf(n); for(j=0;jn;j+) if(mazeij=0|mazei

26、j=2) printf( ); if(mazeij=1) printf(); if(mazeij=3) printf(); void enqueue(struct point p) queuetail = p; tail+;struct point dequeue(void) head+; return queuehead-1; int is_empty(void) return head = tail; void visit(int row,int col,int maze5252) /访问节点 struct point visit_point = row, col, head-1 ; ma

27、zerowcol = 2; enqueue(visit_point);int mgpath(int maze5252,int m,int n) struct point p = 0, 0, -1 ;if(mazep.rowp.col=1) printf(此迷宫无解nn); return 0; mazep.rowp.col = 2; enqueue(p); while (!is_empty() p = dequeue(); if (p.row = m - 1 /* goal */ & p.col = n - 1) break; if (p.col+1 n /* right */ & mazep.rowp.col+1 = 0) visit(p.row, p.col+1,maze); if (p.row+1 = 0 /* left */ & mazep.rowp.col-1 = 0) visit(p.row, p.col-1,maze); if (p.row-1 = 0 /* up */ & mazep.row-1p.col = 0) visit(p.row-1, p.col,maze); print_maze(m,n); printf(n-

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

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