2022年迷宫求解数据结构课程设计报告 .pdf
《2022年迷宫求解数据结构课程设计报告 .pdf》由会员分享,可在线阅读,更多相关《2022年迷宫求解数据结构课程设计报告 .pdf(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据结构课程设计第 1 页 共 16 页数据结构课程设计报告课题名称:迷宫求解姓名:马 兆 瑞学号: 200903021071 专业:电子信息科学与技术班级:信息 09-2 班指导教师:侯 瑞 莲名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 16 页 - - - - - - - - - 数据结构课程设计第 2 页 共 16 页目录第一部分 引言3 第二部分 课程设计报告3 第一章 课程设计目的3 第二章 课程设计内容和要求4 2.1 问题描述4 2.2 设计要求4 第三
2、章 课程设计总体方案及分析4 3.1 问题分析4 3.2 概要设计7 3.3 详细设计7 3.4 调试分析10 3.5 测试结果10 3.6 参考文献12 第三部分 课程设计总结13 附录( 源代码) 14 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 16 页 - - - - - - - - - 数据结构课程设计第 3 页 共 16 页第一部分引言数据结构是一门理论性强、思维抽象、难度较大的课程,是基础课和专业课之间的桥梁。该课程的先行课程是计算机基础、程序设计语言、
3、离散数学等,后续课程有操作系统、编译原理、数据库原理、软件工程等。通过本门课程的学习,我们应该能透彻地理解各种数据对象的特点,学会数据的组织方法和实现方法, 并进一步培养良好的程序设计能力和解决实际问题的能力,而且该课程的研究方法对我们学生在校和离校后的学习和工作,也有着重要的意义。数据结构是电子信息科学与技术专业的一门核心专业基础课程,在该专业的课程体系中起着承上启下的作用, 学好数据结构对于提高理论认知水平和实践能力有着极为重要的作用。学习数据结构的最终目的是为了获得求解问题的能力。对于现实世界中的问题, 应该能从中抽象出一个适当的数学模型,该数学模型在计算机内部用相应的数据结构来表示,然
4、后设计一个解此数学模型的算法,再进行编程调试,最后获得问题的解答。基于此原因, 暑期我们开设了数据结构课程设计。针对数据结构课程的特点, 着眼于培养我们的实践能力。 实习课程是为了加强编程能力的培养,鼓励学生使用新兴的编程语言。相信通过数据结构课程实践,无论是理论知识,还是实践动手能力,同学们都会有不同程度上的提高。第二部分课程设计报告第一章课程设计目的仅仅认识到队列是一种特殊的线性表是远远不够的,本次实习的目的在于使学生深入了解队列的特征,以便在实际问题背景下灵活运用它,同时还将巩固这种数据结构的构造方法名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - -
5、 - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 16 页 - - - - - - - - - 数据结构课程设计第 4 页 共 16 页第二章课程设计内容和要求2.1 问题描述 :迷宫问题是取自心理学的一个古典实验。在该实验中,把一只老鼠从一个无顶大盒子的门放入,在盒子中设置了许多墙, 对行进方向形成了多处阻挡。盒子仅有一个出口,在出口处放置一块奶酪,吸引老鼠在迷宫中寻找道路以到达出口。对同一只老鼠重复进行上述实验,一直到老鼠从入口走到出口, 而不走错一步。 老鼠经过多次试验最终学会走通迷宫的路线。设计一个计算机程序对任意设定的矩形迷宫如下图A 所示,求出一条
6、从入口到出口的通路,或得出没有通路的结论。图 A2.2 设计要求 :要求设计程序输出如下:(1) 建立一个大小为m n的任意迷宫 (迷宫数据可由用户输入或由程序自动生成),并在屏幕上显示出来;(2)找出一条通路的二元组(i,j)数据序列,( i,j)表示通路上某一点的坐标。(3)用一种标志(如数字8)在迷宫中标出该条通路;(4)在屏幕上输出迷宫和通路;(5)上述功能可用菜单选择。第三章课程设计总体方案及分析3.1 问题分析:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共
7、16 页 - - - - - - - - - 数据结构课程设计第 5 页 共 16 页1. 迷宫的建立:迷宫中存在通路和障碍,为了方便迷宫的创建,可用0 表示通路,用 1 表示障碍, 这样迷宫就可以用 0、1 矩阵来描述,2. 迷宫的存储:迷宫是一个矩形区域, 可以使用二维数组表示迷宫, 这样迷宫的每一个位置都可以用其行列号来唯一指定, 但是二维数组不能动态定义其大小,我们可以考虑先定义一个较大的二维数组 mazeM+2N+2, 然后用它的前 m行 n 列来存放元素,即可得到一个m n 的二维数组,这样 (0,0) 表示迷宫入口位置, (m-1,n-1) 表示迷宫出口位置。注:其中 M ,N分
8、别表示迷宫最大行、列数,本程序M 、N的缺省值为 39、39,当然,用户也可根据需要,调整其大小。3. 迷宫路径的搜索:首先从迷宫的入口开始,如果该位置就是迷宫出口,则已经找到了一条路径,搜索工作结束。否则搜索其上、下、左、右位置是否是障碍,若不是障碍,就移动到该位置,然后再从该位置开始搜索通往出口的路径;若是障碍就选择另一个相邻的位置,并从它开始搜索路径。为防止搜索重复出现,则将已搜索过的位置标记为2,同时保留搜索痕迹,在考虑进入下一个位置搜索之前,将当前位置保存在一个队列中,如果所有相邻的非障碍位置均被搜索过,且未找到通往出口的路径,则表明不存在从入口到出口的路径。这实现的是广度优先遍历的
9、算法,如果找到路径,则为最短路径。以矩阵 0 0 1 0 1 为例,来示范一下 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 首先,将位置 (0,0)(序号 0)放入队列中,其前节点为空,从它开始搜索,其标记变为 2,由于其只有一个非障碍位置,所以接下来移动到(0,1)(序号 1),其前节点序号为0,标记变为 2,然后从(0,1) 移动到 (1,1)(序号 2), 放入队列中,其前节点序号为 1,(1,1)存在(1 ,2)( 序号 3)、(2,1)( 序号 4) 两个可移动位置,其前节点序号均为2. 对于每一个非障碍位置,它的相邻非障碍节点均入队列,且它们的前节点序号均为该位置的
10、序号,所以如果存在路径,则从出口处节点的位置,逆序就可以找到其从出口到入口的通路。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 16 页 - - - - - - - - - 数据结构课程设计第 6 页 共 16 页如下表所示: 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) -1 0 1 2 2 3 4 5 6 7 9 由此可以看出,得到最短
11、路径:(3,4)(3,3)(2,3)(2,2)(1,2)(1,1)(0,1)(0,0) 搜索算法流程图如下所示:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 16 页 - - - - - - - - - 数据结构课程设计第 7 页 共 16 页3.2 概要设计1. 构建一个二维数组mazeM+2N+2用于存储迷宫矩阵自动或手动生成迷宫,即为二维数组mazeM+2N+2赋值构建一个队列用于存储迷宫路径建立迷宫节点 struct point,用于存储迷宫中每个节点的访问情况
12、实现搜索算法屏幕上显示操作菜单 2.本程序包含 10个函数: (1)主函数 main() (2) 手动生成迷宫函数 shoudong_maze() (3) 自动生成迷宫函数 zidong_maze() (4) 将迷宫打印成图形 print_maze() (5) 打印迷宫路径 ( 若存在路径 ) result_maze() (6) 入队 enqueue() (7) 出队 dequeue() (8) 判断队列是否为空 is_empty() (9) 访问节点 visit() (10) 搜索迷宫路径 mgpath() 3.3 详细设计实现概要设计中定义的所有数据类型及操作的伪代码算法1. 节点类型和指
13、针类型迷宫矩阵类型: int mazeM+2N+2;为方便操作使其为全局变量迷宫中节点类型及队列类型:struct pointint row,col,predecessor que512 2. 迷宫的操作(1) 手动生成迷宫void shoudong_maze(int m,int n) 定义 i,j为循环变量for(i=m) for(j=n) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 16 页 - - - - - - - - - 数据结构课程设计第 8 页 共 16
14、 页输入 mazeij的值 (2) 自动生成迷宫void zidong_maze(int m,int n) 定义 i,j为循环变量for(i=m) for(j=n) mazeij=rand()%2 /由 于rand()产 生 的 随 机 数 是 从0到RAND_MAX,RAND_MAX是定义在 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_ma
15、ze(int m,int n) 用 i,j循环变量,将 mazeij输出 、 (5) 搜索迷宫路径迷宫中队列入队操作void enqueue(struct point p) 将 p 放入队尾, tail+ 迷宫中队列出队操作struct point dequeue(struct point p) head+, 返回 quehead-1 判断队列是否为空int is_empty() 返回 head=tail的值,当队列为空时,返回0 访问迷宫矩阵中节点名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - -
16、 - - 第 8 页,共 16 页 - - - - - - - - - 数据结构课程设计第 9 页 共 16 页void visit(int row,int col,int maze4141) 建立新的队列节点visit_point,将其值分别赋为row,col,head-1,mazerowcol=2,表 示 该 节 点 以 被 访 问 过 ; 调 用enqueue(visit_point),将该节点入队 路径求解void mgpath(int maze4141,int m,int n) 先定义入口节点为struct point p=0,0,-1,从 maze00 开始访问。如果入口处即为障碍
17、,则此迷宫无解,返回0 ,程序结束。否则访问入口节点,将入口节点标记为访问过mazep.rowp.col=2,调用函数 enqueue(p) 将该节点入队。判断队列是否为空,当队列不为空时,则运行以下操作: 调用 dequeue() 函数,将队头元素返回给p,如果 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,说明
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年迷宫求解数据结构课程设计报告 2022 迷宫 求解 数据结构 课程设计 报告
限制150内