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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

推荐迷宫的路由与生成课程设计说明书数据结构与算法.docx

1、推荐迷宫的路由与生成课程设计说明书数据结构与算法课程设计说明书课 程 名 称: 数据结构与算法设计综合设计课 程 代 码: 题 目: 迷宫的生成与路由 年级/专业/班: 学 生 姓 名: 学 号: 开 始 时 间: 年 月 日完 成 时 间: 年 月 日课程设计成绩:平时学习态度与效果(30)技术水平与实际能力(30)团队协作与技术创新(10分)设计说明书撰写质量(30)总 分(100)指导教师签名: 年 月 日1 需求分析12 概要设计33详细设计94调试分析205用户使用说明226测试结果247结论26致谢29参考文献30摘 要 用C+语言编写的生成一个NM(N行M列)的迷宫,完成迷宫的组

2、织和存储,并实现迷宫路由算法。(1)使用二维数组matrixMN表示迷宫,其中M,N为迷宫的行、列数,当元素值为0时表示该点是通路,当元素值为1时表示该点是墙。在每一点都有4种方向可以走,可以用数组wall4来表示每一个方向上的墙,用另一个二维数组graphMN记录墙和节点的情况。(2)选用深度优先算法和广度优先算法寻找路径,迷宫由程序自动创建。关键词:迷宫生成、广度优先、深度优先 引 言 1 需求分析 设计算法生成一个N*M(N 行M 列)的迷宫,并完成迷宫的组织和储存。实现两种不同的迷宫算法:广度优先,深度优先算法。 要求: 1N 和M 是用户可配置的,缺省值为50 和50。 2迷宫的入口

3、和出口分别在第0行和第N-1行上,随机选择。 3生成迷宫要求是随机,且连通的。4. 迷宫具有多条分支路线 。5. 进行深度优先探索迷宫路径并进行输出。6. 进行广度优先探索迷宫路径并进行输出。7实现图形化界面显示。8. 在图形界面输出寻路过程坐标。8. 实现按钮事件处理的图形用户界面交互。1.1任务与分析随机生成一个迷宫(由用户规定其大小)并使用。算法分析迷宫是连通的。使用图形表示,并分别在迷宫的第一行和最后一行随机选择出口和入口,输出可通迷宫的最佳路径。任务一:迷宫随机生成算法的实现。任务二:迷宫深度.优先搜索算法实现。任务三:迷宫广度优先搜索算法实现。任务三:进行图形界面的表示。分析: 对

4、三大主要功能模块进行三大主类设计,分别为Maze类,DFS类,BFS类,最后使用MFC应用程序进行图形界面的表示。1.2测试数据 m, n 取默认值50,50 m, n 取默认值20,20 m, n 取默认值60, 602 概要设计(此处说明本课程设计题目的模块划分及各模块的功能介绍和对应的函数名(原型)以及各模块间的层次(调用)关系以框图描述)1本系统所设计的函数见表2.1MazeCell类函数名称函数原型功能描述MazeCellMazeCell();迷宫格对象初始化。Maze类函数名称函数原型功能描述MazeMaze(int m = 49, int n = 49)初始化迷宫行数和列数,构造

5、节点矩阵createMazevoid createMaze()随机创建课连通迷宫printMazevoid printMaze()在DOS界面打印迷宫hasUnaccessAdjNodebool hasUnaccessAdjNode(int,int)判断下一节点是否可以访问breakWallvoid breakWall(MazeCell*)拆掉墙,使两节点连通toNextNodevoid toNextNode()移动当前节点到下一节点makeRomdanStartAndEndvoid makeRomdanStartAndEnd()随机生成入口和出口getGraphRowint getGraph

6、Row()返回迷宫矩阵的行数getGraphColumnint getGraphColumn()返回迷宫矩阵的列数MazeMaze()销毁迷宫,释放内存getGraphint* getGraph()返回迷宫的矩阵数组Coordinate类函数名称函数原型功能描述CoordinateCoordinate(int, int)Coordinate()对象手动初始化以及默认初始化getXint getX();获得坐标X值getYint getY();获得坐标Y值DFS类函数名称函数原型功能描述DFSDFS(int *graph, int, int ); DFS对象初始化mazePathvoid maz

7、ePath();DFS算法寻找生成迷宫路径hasPathbool hasPath(int x, int y);有可访问迷宫格判断printPathvoid printPath();Dos界面打印路径getValueint getValue(int, int);获得DFS对象某个迷宫格的value值BFS类函数名称函数原型功能描述BFSBFS(int *graph, int, int ); BFS对象初始化mazePathvoid mazePath();BFS算法寻找生成迷宫路径hasPathbool hasPath(int x, int y);有可访问迷宫格判断printPathvoid pr

8、intPath();Dos界面打印路径getValueint getValue(int, int);获得BFS对象某个迷宫格的value值MFC应用程序函数名称函数原型功能描述OnBnClickedCreatemazeOnBnClickedCreatemaze()点击“生成迷宫”按钮随机生成迷宫,并且在窗口进行显示OnBnClickedDfsOnBnClickedDfs()点击“DFS寻路”按钮在生成迷宫上进行DFS寻路,在窗口显示OnBnClickedBfsOnBnClickedBfs()点击“BFS寻路”按钮在生成迷宫上进行BFS寻路,在窗口显示OnBnClickedExitOnBnCli

9、ckedExit()点击“退出按钮”,程序关闭退出OnBnClickedAboutOnBnClickedAbout()点击“关于”按钮,显示程序使用说明及其他2本系统函数的调用关系见图2.1O3详细设计(对概要设计部分所介绍的功能模块进行详细介绍及实现。并给出相应函数的定义即实现函数。)1.节点类型和指针类型 MazeCell* matrix 存储迷宫节点的数组 stackmazeStack 存放节点的堆栈 迷宫中节点类型的定义: typedef class MazeCell private: bool isAccessed; /可访问性 int x, y; /坐标 int wall4; /四

10、面墙 bool flags; /标记一个节点是否已被访问MazeNode;2.迷宫的操作(1)创建迷宫void Maze:createMaze()currentCell = &matrix00; /从0,0开始访问 currentCell-isAccessed = true;/初始点为0,0 标记为真 Accessed += 1; /访问节点加1 toNextNode(); /寻找下一节点 for (int i = 0; irow; i+)/将每一行节点的上下墙(也有是可能已经被拆掉成为可走的格子)弄为迷宫里的该节点格子上下格子 for (int j = 0; jcolumn; j+) gra

11、ph2 * i2 * j + 1 = *matrixij.wall; if (i = row - 1) graph2 * i + 22 * j + 1 = *(matrixij.wall + 1); for (int j = 0; jcolumn; j+)/将每一列节点的左右墙(也有可能是可走)弄为迷宫里的该节点格子左右格子 for (int i = 0; irow; i+) graph2 * i + 12 * j = *(matrixij.wall + 2); if (j = column - 1) graph2 * i + 12 * j + 2 = *(matrixij.wall + 3)

12、; makeRandomStartAndEnd(); /随机定义迷宫出入口 cout n现在生成迷宫!: x; int currentY = currentCoordinate-y; mazePointercurrentXcurrentY.accessed = true; mazePointercurrentXcurrentY.value = 2; int i; while (currentX != (m-1) currentX = currentCoordinate-x; currentY = currentCoordinate-y; i = -1;/记录有效相邻格子数 cout X: cu

13、rrentX Y: currentY accessed = true; pathStack.push(*currentCoordinate);/将上一个格子坐标进栈 currentCoordinate = tempi; currentCoordinate-value = 2; currentCoordinate-accessed = true; accesseCount+; currentX = currentCoordinate-x; currentY = currentCoordinate-y; else if (!pathStack.empty()/当前格子无可走的相邻格子,返回到上一个

14、格子 mazePointercurrentXcurrentY.value = -1; currentCoordinate = &pathStack.top(); pathStack.pop(); 4.BFS算法实现void BFS:mazePath() currentCoordinate = new CoordinateBFS(0, start); int count1 = 0, count2 = 0;/count1为记录前一个被访问格子(栈顶部格子)可走相邻格子数,count2为当前访问格子的可走相邻格子数 int currentX = currentCoordinate-x; int cu

15、rrentY = currentCoordinate-y; mazePointercurrentXcurrentY.accessed = true; mazePointercurrentXcurrentY.value = 2; /int entry = startPoint; /入口id /int exit = endPoint; /出口id /记录所有房间的访问路径,traPathi表示访问到房间i的路径上的前一节点 /vector traPath(endPoint,-1); /depathQuery pathQuery; s_i = 0; s = new CStringm*n; pathQ

16、uery.push_back(mazePointer0start); while (!pathQuery.empty() if (currentX = (m - 1) break; int i = 0; /if (mazePointercurrentXcurrentY.value = 2) /如果已经该房间已经访问过了,则跳过 / continue; if (hasPath(currentX, currentY - 1) pathQuery.push_back(mazePointercurrentXcurrentY - 1); /mazePointercurrentXcurrentY - 1.

17、value = 2; currentCoordinate-accessed = true; i+; if (hasPath(currentX, currentY + 1) pathQuery.push_back(mazePointercurrentXcurrentY + 1); /mazePointercurrentXcurrentY + 1.value = 2; currentCoordinate-accessed = true; i+; if (hasPath(currentX - 1, currentY) pathQuery.push_back(mazePointercurrentX -

18、 1currentY); /mazePointercurrentX - 1currentY.value = 2; currentCoordinate-accessed = true; i+; if (hasPath(currentX + 1, currentY) pathQuery.push_back(mazePointercurrentX + 1currentY); /mazePointercurrentX + 1currentY.value = 2; currentCoordinate-accessed = true; i+; if (i = 0) mazePointercurrentXc

19、urrentY.value = -1; else mazePointercurrentXcurrentY.value = 2; pathQuery.pop_front(); currentCoordinate = &pathQuery.front(); currentX = currentCoordinate-x; currentY = currentCoordinate-y; ss_i+.Format(_T(%d,%d)n), currentX, currentY); /cout X: currentX Y: currentY endl; 5.MFC按钮功能实现void CMaze_MFCD

20、lg:OnBnClickedCreatemaze() / TODO: 在此添加控件通知处理程序代码 int m, n; UpdateData(TRUE); if (m_MazeX = 0 | m_MazeY = 0) m = 50; n = 50; else m = (int)m_MazeX; n = (int)m_MazeY; Maze maze(m,n);/创建迷宫对象 maze.createMaze(); r = maze.getGraphRow(); c = maze.getGraphColumn(); Arr = maze.getGraph(); Arr = new int*maze

21、.getGraphRow(); for (int i = 0; imaze.getGraphRow(); i+) Arri = new intmaze.getGraphColumn(); for (int i = 0; ir; i+) for (int j = 0; jc; j+) Arrij =maze.getGraph()ij; /double length = 50; /double wide = 50; /*int x = 5; int y = 5;*/ HDC hdc = :GetDC(m_hWnd); HBRUSH hbrush_BK, hbrushOld_BK; hbrush_B

22、K = CreateSolidBrush(RGB(255, 255, 255); hbrushOld_BK = (HBRUSH)SelectObject(hdc, hbrush_BK); :Rectangle(hdc, 0, 0, 700 , 700); SelectObject(hdc, hbrushOld_BK); DeleteObject(hbrush_BK); for (int i = 0; i r; i+) for (int j = 0; j c; j+) if (Arrij = 1)/墙 HBRUSH hbrush, hbrushOld; hbrush = CreateSolidB

23、rush(RGB(138, 54, 15); hbrushOld = (HBRUSH)SelectObject(hdc, hbrush); :Rectangle(hdc, i*10, j*10, i*10+10, j * 10 + 10); SelectObject(hdc, hbrushOld); DeleteObject(hbrush); :ReleaseDC(m_hWnd, hdc); void CMaze_MFCDlg:OnBnClickedDfs() / TODO: 在此添加控件通知处理程序代码 DFS dfs(Arr, r, c); dfs.mazePath(); /*dfs.pr

24、intPath();*/ HDC hdc = :GetDC(m_hWnd); for (int i = 0; i r; i+) for (int j = 0; j c; j+) if (dfs.getValue(i , j) = 2) HBRUSH hbrush, hbrushOld; hbrush = CreateSolidBrush(RGB(0, 0, 255); hbrushOld = (HBRUSH)SelectObject(hdc, hbrush); :Rectangle(hdc, i * 10, j * 10, i * 10 + 10, j * 10 + 10); SelectObject(hdc, hbrushOld);

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

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