迷宫求解数据结构课程设计报告3讲解_第1页
迷宫求解数据结构课程设计报告3讲解_第2页
迷宫求解数据结构课程设计报告3讲解_第3页
迷宫求解数据结构课程设计报告3讲解_第4页
迷宫求解数据结构课程设计报告3讲解_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录1 课程设计错. 误!未定义书签1.1 问题描述 错. 误!未定义书签。1.2 需求分析 21.3 概要设计 31.4 流程图 41.5 详细设计 51.6 调试分析 81.7 运行结果及分析2 课程设计个人总结 1.1.附录 12数据结构应用评分表 181.1 问题描述 :a. 问题描述:以一个 m * n的长方阵表示迷宫, 0和1分别表示迷宫的通路和障碍。设计 一个程序,对任意设定的迷宫, 求出一条从入口到出口的通路, 或得出没有通路的结论。b. 基本要求 :(1)实现一个以链表做存储的栈类型,然后编写一个求解迷宫的非递归程序。求的通 路以三元组( i ,j ,d)的形式输出,其中:(

2、i ,j )指示迷宫中的一个坐标, d表示走 到下一坐标的方向。如:对于下列数据的迷宫,输出一条通路: (1,1,1),(1,2,2), (2,2,2),(3,2,3),(3,1,2)。(2)编写递归形式的算法,求得迷宫中所有可能的道路;( 3)以方阵形式输出迷宫及其到道路(选做)c. 测试数据:迷宫的测试数据如下:左上角( 1,1)为入口,右下角( 8, 9)为出口。001000100010001000001101011100100001000001000101011110011100010111000000d. 实现提示:计算机解迷宫通常用的是“穷举求解”方法,即从入口出发,顺着米 一个方

3、向进行探索,若能走通,则继续往前进;否则沿着原路退回,换一个方向继续探 索,直至出口位置,求的一条通路。假如所有的可能的通路都探索到而未能到出口,则 所设定的迷宫没有通路。 可以二维数组存储迷宫数据, 通常设定入口点的下标为 (1,1), 出口点的下标为( n,n)。为处理器方便起见,可在迷宫的四周加上一圈障碍 。对于迷宫中任一位置,均可约定有东、西、南、北四个方向可通。1.2 需求分析:本课程设计是解决迷宫求解的问题,从入口出发,顺某一方向向前探索,若能走通,则 继续往前走;否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到 为止。为了保证在任何位置上都能沿原路退回,显然需要用

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

5、。假设以栈记录“当前路径” ,则栈顶中存放的是“当前路径上最后一个通道 块”。由此,“纳入路径” 的操作即为“当前位置入栈”;“从当前路径上删除前一通道块” 的操作即为“出栈”。问题分析:1. 迷宫的建立: 迷宫中存在通路和障碍,为了方便迷宫的创建,可用 0 表示通路,用 1 表示 障碍,这样迷宫就可以用 0、1 矩阵来描述,2. 迷宫的存储: 迷宫是一个矩形区域,可以使用二维数组表示迷宫,这样迷宫的每一个位置 都可以用其行列号来唯一指定,但是二维数组不能动态定义其大小,我们可以考 虑先定义一个较大的二维数组 mazeM+2N+2, 然后用它的前 m行 n 列来存放元 素,即可得到一个 mn

6、的二维数组,这样 (0,0) 表示迷宫入口位置, (m-1,n-1) 表示迷宫出口位置。注:其中 M,N分别表示迷宫最大行、 列数,本程序 M、N 的缺省值为 39、39, 当然,用户也可根据需要,调整其大小。3. 迷宫路径的搜索:首先从迷宫的入口开始,如果该位置就是迷宫出口,则已经找到了一条路 径,搜索工作结束。否则搜索其上、下、左、右位置是否是障碍,若不是障碍, 就移动到该位置,然后再从该位置开始搜索通往出口的路径;若是障碍就选择 另一个相邻的位置,并从它开始搜索路径。为防止搜索重复出现,则将已搜索 过的位置标记为 2,同时保留搜索痕迹, 在考虑进入下一个位置搜索之前, 将当 前位置保存在

7、一个队列中,如果所有相邻的非障碍位置均被搜索过,且未找到 通往出口的路径,则表明不存在从入口到出口的路径。这实现的是广度优先遍 历的算法,如果找到路径,则为最短路径。以矩阵 0 0 1 0 1 为例,来示范一下1 0 0 1 01 0 0 0 10 0 1 0 0首先,将位置 (0,0)( 序号 0) 放入队列中,其前节点为空,从它开始搜 索,其标记变为 2,由于其只有一个非障碍位置, 所以接下来移动到 (0,1)( 序号 1) ,其前节点序号为 0,标记变为 2,然后从(0,1) 移动到(1,1)( 序号 2),放入 队列中,其前节点序号为 1,(1,1) 存在(1 ,2)( 序号 3) 、

8、(2 ,1)( 序号 4)两个可 移动位置,其前节点序号均为 2. 对于每一个非障碍位置,它的相邻非障碍节点 均入队列,且它们的前节点序号均为该位置的序号,所以如果存在路径,则从 出口处节点的位置,逆序就可以找到其从出口到入口的通路。如下表所示:0 1 2 3 4 5 6 7 8 910(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.3 概要设计1. 构建一个二维数组 mazeM+2N+2 用于存储

9、迷宫矩阵 自动或手动生成迷宫,即为二维数组 mazeM+2N+2 赋值 构建一个队列用于存储迷宫路径建立迷宫节点 struct point, 用于存储迷宫中每个节点的访问情况 实现搜索算法屏幕上显示操作菜单2. 本程序包含 10 个函数:(1) 主函数 main()(2) 手动生成迷宫函数 shoudong_maze()(3) 自动生成迷宫函数 zidong_maze()(4) 将迷宫打印成图形 print_maze()(5) 打印迷宫路径 ( 若存在路径 ) result_maze()(6) 入队 enqueue()(7) 出队 dequeue()(8) 判断队列是否为空 is_empty(

10、)(9) 访问节点 visit()(10) 搜索迷宫路径 mgpath()1.4 流程图:1.5 详细设计实现概要设计中定义的所有数据类型及操作的伪代码算法1. 节点类型和指针类型迷宫矩阵类型: int mazeM+2N+2; 为方便操作使其为全局变量迷宫 中节点 类型及队 列类 型: struct pointint row,col,predecessor que5122. 迷宫的操作(1) 手动生成迷宫void shoudong_maze(int m,int n) 定义 i,j 为循环变量 for(i=m) for(j=n) 输入 mazeij 的值 (2) 自动生成迷宫void zidon

11、g_maze(int m,int n) 定义 i,j 为循环变量 for(i=m) for(j=n) mazeij=rand()%2/由 于 rand() 产 生 的 随 机 数 是 从 0 到 RAND_MAX,RAND_M是A定X义在 stdlib.h 中的 , 其值至少为 32767), 要产生从 X 到 Y 的 数 , 只 需 要 这样 写: k=rand()%(Y-X+1)+X;(3) 打印迷宫图形void print_maze(int m,int n)用 i,j 循环变量,将 mazeij (4) 打印迷宫路径void result_maze(int m,int n)用 i,j 循

12、环变量,将 mazeij (5) 搜索迷宫路径迷宫中队列入队操作输出 、 输出 、 void enqueue(struct point p) 将p放入队尾, tail+ 迷宫中队列出队操作struct point dequeue(struct point p)head+, 返回 quehead-1判断队列是否为空int is_empty() 返回 head=tail 的值,当队列为空时,返回 0访问迷宫矩阵中节点void visit(int row,int col,int maze4141) 建 立 新 的 队 列 节 点 visit_point, 将 其 值 分 别 赋 为 row,col,

13、head-1,mazerowcol=2, 表示该节点以被访问过 ; 调用 enqueue(visit_point), 将该节点入队 路径求解void mgpath(int maze4141,int m,int n) 先定义入口节点为 struct point p=0,0,-1,从 maze00 开始访问。如果入口处即为障碍,则此迷宫无解,返回 0 ,程序结束。 否则访问入口节点,将入口节点标记为访问过 mazep.rowp.col=2, 调用函数 enqueue(p) 将该节点入队。判断队列是否为空,当队列不为空时,则运行以下操作: 调用 dequeue() 函数,将队头元素返回给 p ,如果

14、 p.row=m-1 且 p.col=n-1, 即到达出口节点,即找到了 路径,结束如果 p.col+1n 且 mazep.rowp.col+1=0, 说明未到迷宫 右边界,且其右方有通路,则 visit(p.row,p.col+1,maze), 将右边节点入队标记已访 问如果 p.row+10 且 mazep.rowp.col-1=0, 说明未到迷宫 左边界,且其左方有通路,则 visit(p.row,p.col-1,maze), 将左方节点入队标记已访 问如果 p.row-10 且 mazep.row-1p.col=0, 说明未到迷宫 上边界,且其上方有通路,则 visit(p.row,p

15、.col+1,maze), 将上方节点入队标记已访 问访问到出口 (找到路径 )即p.row=m-1且 p.col=n-1, 则逆序将路 径标记为 3 即 mazep.rowp.col=3;while(p.predecessor!=-1)p=queuep.predecessor; mazep.rowp.col=3; 最后将路径图形打印出来。3. 菜单选择while(cycle!=(-1)手动生成迷宫请按:1自动生成迷宫请按:2退出请按:3scanf(%d,&i);switch(i) case 1:请输入行列数 ( 如果超出预设范围则提示重新输入 )shoudong_maze(m,n);prin

16、t_maze(m,n);mgpath(maze,m,n);if(X!=0) result_maze(m,n);case 2 :请输入行列数 ( 如果超出预设范围则提示重新输入 ) zidong_maze(m,n); print_maze(m,n); mgpath(maze,m,n); if(X!=0) result_maze(m,n);case 3 :cycle=(-1); break;注:具体源代码见附录1.6 调试分析1. 在调试过程中,首先使用的是栈进行存储,但是产生的路径是多条或不是最短路径, 所以通过算法比较,改用此算法2. 调试过程出现了最多 60 个错误。后经多次调试检查,发现有

17、些格式问题没有注意 比如函数括号的放置等。1.7 运行结果及分析1. 手动输入迷宫2. 自动输入迷宫910第二部分 课程设计总结通过这段时间的数据结构课程设计,本人对计算机的应用,数据结构的作用以及 C 语言的使用都有了更深的了解。 尤其是 C语言的进步让我深刻的感受到任何所学的知识 都需要实践,没有实践就无法真正理解这些知识以及掌握它们,使其成为自己的财富。 在理论学习和上机实践的各个环节中,通过自主学习和认真听老师讲课分析,我收获了 不少。当然也遇到不少的问题,也正是因为这些问题引发的思考给我带了收获。从当初 不喜欢上机写程序到现在能主动写程序, 从当初拿着程序不只如何下手到现在知道如何

18、分析问题,如何用专业知识解决实际问题的转变, 我发现无论是专业知识还是动手能力, 自己都有很大程度的提高。在这段时间里,我对 for 、 while 等的循环函数用法更加熟 悉,逐渐形成了较好的编程习惯。在老师的指导帮助下,同学们课余时间的讨论中,这 些问题都一一得到了解决。在程序的调试能力上,无形中得到了许多的提高。例如:头 文件的使用,变量和数组的范围问题,定义变量时出现的问题等等。在实际的上机操作过程中,不仅是让我们了解数据结构的理论知识,更重要的是培 养解决实际问题的能力,所以相信通过此次实习可以提高我们分析设计能力和编程能 力,为后续课程的学习及实践打下良好的基础。时间过得真快,大学

19、生活不知不觉就走 过了一学期,这一学期的大学学习和课程实践阶段的提高,使我们本身知识得到提高的 同时,也增强了我们对未来工作的信心,我们相信自己未来两年半的学习更使我们有能 力胜任将来的工作。11附录:#include #include #define N 39 #define M 39 int X;int mazeN+2M+2; struct point int row,col,predecessor; queue512;int head=0,tail=0;void shoudong_maze(int m,int n) int i,j;printf(nn);printf( 请按行输入迷宫,

20、0 表示通路, 1 表示障碍 :nn); for(i=0;im;i+) for(j=0;jn;j+)scanf(%d,&mazeij);void zidong_maze(int m,int n)int i,j;printf(n 迷宫生成中 nn); system(pause);for(i=0;im;i+)12 for(j=0;jn;j+)mazeij=rand()%2;/由于 rand()产生的随机数是从 0到 RAND_MAX (最大) /RAND_MAX 是定义在 stdlib.h 中的 ,其值至少为 32767) /要产生从 X 到 Y 的数,只需要这样写: k=rand()%(Y-X+

21、1)+X; void print_maze(int m,int n)int i,j;printf(n 迷宫生成结果如下 :nn);printf(迷宫入口 n);printf( );for(i=0;im;i+)printf(n);for(j=0;jn;j+)if(mazeij=0) printf( );if(mazeij=1) printf( );printf( 迷宫出口 n);void result_maze(int m,int n)int i,j;printf( 迷宫通路 (用表示 )如下所示: nt); for(i=0;im;i+)printf(n);for(j=0;jn;j+);if(m

22、 azeij=0|mazeij=2) printf( if(mazeij=1) printf( ); if(mazeij=3) printf( );void enqueue(struct point p)queuetail=p;tail+;13 struct point dequeue()head+;return queuehead-1;int is_empty()return head=tail;void visit(int row,int col,int maze4141)struct point visit_point=row,col,head-1;mazerowcol=2;enqueu

23、e(visit_point);int mgpath(int maze4141,int m,int n)X=1;struct point p=0,0,-1;if(mazep.rowp.col=1)printf(n=n); printf( 此迷宫无解 nn);X=0;return 0;mazep.rowp.col=2;enqueue(p);while(!is_empty()p=dequeue();if(p.row=m-1)&(p.col=n-1) break;if(p.col+1n)&(mazep.rowp.col+1=0) visit(p.row,p.col+1,maze); if(p.row+

24、1=0)&(mazep.rowp.col-1=0) visit(p.row,p.col-1,maze); if(p.row-1=0)&(mazep.row-1p.col=0) visit(p.row-1,p.col,maze);if(p.row=m-1&p.col=n-1)printf(n= =n);printf( 迷宫路径为: n);printf(%d,%d)n,p.row,p.col);mazep.rowp.col=3;while(p.predecessor!=-1)14 p=queuep.predecessor; printf(%d,%d)n,p.row,p.col); mazep.ro

25、wp.col=3;else printf(n= =n);printf(此迷宫无解! nn);X=0;return 0;void main(void)int i,m,n,cycle=0;while(cycle!=(-1)printf(*n);printf(设计者:欢迎进入迷宫求解系统 n);printf(张增荣 n);printf(*n);printf(_ 手动生成迷宫请按:1n);printf(_ 自动生成迷宫请按:2n);printf(_ 退出请按:3nn);printf(*n);printf(n);printf(请选择你的操作: n);scanf(%d,&i);switch(i)15case 1:printf(n 请输入行数: );scanf(%d,&m);printf(n);printf( 请输入列数: );scanf(%d,&n); while(m39)|(n39)printf(n 抱歉,你

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论