1、数据结构迷宫求解课程设计报告课程设计报告课程名称: 数据结构 报告题目: 迷宫求解 学生姓名: XX 所在学院: 信息科学与工程 专业班级: 软件工程 学生学号:XXXXXXXXXXX 指导教师: XXX 2017 年 12 月 29 日课程设计任务书报告题目迷宫求解程序设计完成时间2017.12.29学生姓名 专业班级指导教师XXX职 称总体设计要求和技术要点课程设计要求1.可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;2.在上交资料中请写明:存储结构、基本算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法;
2、工作内容及时间进度安排第17周:周1-周3 :立题、论证方案设计周4-周5 :完成项目一,项目二的整体设计第18周:周1-周2:调试程序,解决问题周3-周5 :写实验报告 课程设计成果1程序设计内容以及对应的软件程序2课程设计总结报告摘 要 本程序主要是求迷宫中从人口到出口的所有路径是一个经典的程序设计问题。计算机解迷宫时,通常用的是“穷举求解”的方法,即从入口出发,顺某一方向向前探索,若能走通,则继续往前走;否则沿原路返回,换一个方向在继续探索,直至所有可能的通路都探索完为止。当前位置“可通”,则纳入“当前路径”,并继续朝“下一位置”探索,即切换为“下一位置”为“当前位置”,如此重复直至到达
3、出口;若当前位置“不可通”,则应顺着“来的方向”退回到“前一通道块”,若该通道块的四周4个方块均“不可通”则应从当前路径删除该通道块。所谓“下一位置”指的是“当前位置”四周4个方向(东、南、西、北)上相邻的方块。以栈S来记录“当前路径”,则栈顶中存放的是“当前路径上最后一个通道块”。所以即为“当前路径入栈”;“从当前路径上删除前一通道块”为“出栈”。在这个过程中可以输出迷宫所走通的路径,在这次课程设计中迷宫是由数组预先定义好的,不能由用户定义生成,可以加入随机函数,自动生成二维数组,还可以用户自己输入迷宫。关键词:栈;存储结构;数组 一、课题分析(1)该题目为迷宫求解。(2)此课题是对迷宫问题
4、的求解。包括用数组生成迷宫,显示输出路径因此,本程序设计共需设计一个主程序以及若干个子程序。(3)在本课程设计程序里,主程序主要是以一个mn的长方形表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对设定的迷宫,求出一条从入口到出口的通路,子程序实现迷宫地图的查看和通过迷宫后的路径查询。二、需求分析1. 主模块功能描述 显示提示语句提示用用户选择输入执行的功能。(1)开始迷宫求解游戏 (2)查询迷宫地图(3)查询通过迷宫后的路径 2. 子程序模块设计(1)迷宫求解游戏 输入1开始游戏(2)查询迷宫地图 在菜单中输入2查看迷宫求解的地图(3)查询通过迷宫后的路径 输入2查询通关路径三、设
5、计方案1.类设计构建一个Hidding类,并有私有成员:x坐标,y坐标,位置标志,初始方向;共有成员:PrintMap打印地图,GameFunction游戏主循环,Move_up向上移动,Move_down向下移动,Move_left向左移动,Move_right向右移动,IsGameOver判断游戏是否结束,Move_Keys接收移动的指令,InDirection相反方向输出,dir_flage方向标志,Hidding:Start()开始游戏等等类,在通过类的实现来执行相应的功能,具体代码如下:class Hiddingprivate: int point_x; /控制运动的点的x坐标 in
6、t point_y; /控制运动的点的y坐标 int flage; /判断标志 int direction; /初始方向public: Hidding(); int PrintMap(int mapHH); /打印地图 int GameFunction(int mapHH, SqStack &S);/游戏主循环 int Move_up(int mapHH,SqStack &S); /向上移动 int Move_down(int mapHH, SqStack &S); /向下移动 int Move_left(int mapHH, SqStack &S); /向左移动 int Move_right
7、(int mapHH, SqStack &S); /向右移动 bool IsGameOver(int mapHH); /判断游戏是否结束 int Move_Keys(int key, int mapHH, SqStack &S); /接收移动的指令 int InDirection(int key); /相反方向输出 int dir_flage; /方向标志 int Out(int mapHH);/显示通关路径 int Outa(int mapHH); int Hidding:menu();/菜单 int Hidding:Start();/开始游戏 ;2.程序模块设计设计方案与实施与总体设计思想
8、(1) 迷宫形状由0表示可通过,用1表示障碍。为方便用0,1输入,2表示起点,3表示终点。并把迷宫图形保存在二维数组Map中,而打印出的图形中“”表示能通过,“”表示障碍。对探索过的位置加以标记“”,起点和终点分别由“”,“”表示,“”表示为当前目标位置。(2) 根据二位字符数组和加标记的位置坐标,输出迷宫的图形。(3) 该程序在获取迷宫图形结构后,目标点从起点开始搜索可通过的路径,目标点通过判断身边上下左右四个位置是否有障碍而选择前进路径,如果判断之后遇到没有可以通过的方向,将会退回之前的位置,另行判断。直至目标点找到出口后,输出通过的路径,程序结束。1.2程序设计流程图入口出发,顺某一方向
9、向前探索,若能走通,则继续往前走;否则沿原路返回,换一个方向在继续探索,直至所有可能的通路都探索完为止。图1游戏的主循环 3. 主模块 若当前位置“可通”,则纳入“当前路径”,并继续朝“下一位置”探索,即切换为“下一位置”为“当前位置”,如此重复直至到达出口;若当前位置“不可通”,则应顺着“来的方向”退回到“前一通道块”,然后朝着除“来向”之外的其他方向继续探索;若该通道块的四周4个方块均“不可通”则应从当前路径删除该通道块。所谓“下一位置”指的是“当前位置”四周4个方向(东、南、西、北)上相邻的方块。以栈S来记录“当前路径”,则栈顶中存放的是“当前路径上最后一个通道块”。所以即为“当前路径入
10、栈”;“从当前路径上删除前一通道块”为“出栈”。图2游戏的主框架3.1 子模块图3实现迷宫游戏地图查询后开始游戏3.程序调试结果及分析3.1 主菜单这是主界面,提示A、B、C各自代表的功能,输入1或2或3会跳转到相应的功能模块,输入1开始游戏,输入2可查看需要通关的游戏地图,输入3返回。 图4程序界面图3.2 功能A模块当从键盘输入1进入A功能模块,此图是寻找迷宫路径,游戏会由电脑自动完成,入口出发,顺某一方向向前探索,若能走通,则继续往前走;否则沿原路返回,换一个方向在继续探索,直至所有可能的通路都探索完为止,若是成功找到路径,则输出恭喜过关,并且提示是否查看通关路径。图5程序正在运行图3.
11、3 功能B模块从键盘输入2查询迷宫地图,可显示游戏需要通关的迷宫地图,继续输入1可以开始游戏。图6迷宫地图 3.4 功能C模块游戏的主循环的类的实现表示游戏的开始,判断当前位置标记是否为3,如果为3,则表示该位置为终点,游戏结束,输出恭喜过关,提示是否查看通关路径,从键盘输入2查询通关路径 图7目标完成游戏路径图图四、详细设计1.用结构体构建栈 通过构建的栈实现迷宫求解时寻找路径的数据的存放于取出,其关键代码如下:typedef struct SElemType *top; /顶部指针 SElemType *base; /底部指针 int stacksize; /当前栈的大小SqStack;2
12、.构建类构建一个Hidding类,并有私有成员:x坐标,y坐标,位置标志,初始方向;共有成员:PrintMap打印地图,GameFunction游戏主循环,Move_up向上移动,Move_down向下移动,Move_left向左移动,Move_right向右移动,IsGameOver判断游戏是否结束,Move_Keys接收移动的指令,InDirection相反方向输出,dir_flage方向标志,Hidding:Start()开始游戏等等类,在通过类的实现来执行相应的功能,具体代码如下:class Hiddingprivate: int point_x; /控制运动的点的x坐标 int po
13、int_y; /控制运动的点的y坐标 int flage; /判断标志 int direction; /初始方向public: Hidding(); int PrintMap(int mapHH); /打印地图 int GameFunction(int mapHH, SqStack &S);/游戏主循环 int Move_up(int mapHH,SqStack &S); /向上移动 int Move_down(int mapHH, SqStack &S); /向下移动 int Move_left(int mapHH, SqStack &S); /向左移动 int Move_right(int
14、 mapHH, SqStack &S); /向右移动 bool IsGameOver(int mapHH); /判断游戏是否结束 int Move_Keys(int key, int mapHH, SqStack &S); /接收移动的指令 int InDirection(int key); /相反方向输出 int dir_flage; /方向标志 int Out(int mapHH);/显示通关路径 int Outa(int mapHH); int Hidding:menu();/菜单 int Hidding:Start();/开始游戏 ;3.用数组构建一个迷宫1.迷宫形状由0表示可通过,用
15、1表示障碍。为方便用0,1输入,2表示起点,3表示终点。并把迷宫图形保存在二维数组Map中,而打印出的图形中“”表示能通过,“”表示障碍。对探索过的位置加以标记“”,起点和终点分别由“”,“”表示,“”表示为当前目标位置,其关键代码如下:int mapHH = 1,1,1,1,1,1,1,1,1,1, /(9,0) (9,9) 1,0,0,0,0,0,1,0,0,1, 1,0,1,1,0,0,1,0,0,1, 1,0,0,1,1,0,1,0,1,1, 1,1,0,0,1,0,0,0,1,1, 1,1,0,1,1,1,1,0,0,1, 1,1,0,1,1,1,1,1,0,1, 1,0,0,1,1
16、,1,1,1,0,1, 1,2,1,1,1,1,1,1,3,1, 1,1,1,1,1,1,1,1,1,1 /(0,0) (0,9);2.打印出的图形中“”表示能通过,“”表示障碍。对探索过的位置加以标记“”,起点和终点分别由“”,“”表示,“”表示为当前目标位置,其关键代码如下:int Hidding:PrintMap(int mapHH) for (int i = 0; i H; i+) for (int j = 0; j H; j+) switch (mapij) case 0: cout ; break; case 1: /墙 cout ; break; case 2: /起点 cout
17、 ; break; case 3: /终点 cout ; break; case 7: /走过的路径 cout ; break; case 9: cout ; break; default: break; cout endl; return 0;/PrintMap4.游戏移动控制指令构建一个栈,用Key控制移动,上移指令Key=8,下移指令Key=5,左移指令Key=4,右移指令Key=6,其关键代码如下: int Hidding:Move_Keys(int key,int mapHH, SqStack &S) switch (key) case 8: Move_up(map,S); brea
18、k; case 4: Move_left(map,S); break; case 6: Move_right(map,S); break; case 5: Move_down(map,S); break; default: break; return 0;/Move_Keys5.游戏移动控制指令四个方向的实现以向上移动指令的实现为例,判断是否是走过的路径,若是则x-1当前位置标记为0;判断前方是否可行,若是x-1,当前位置标记为7,(7为走过的路径),并且入栈执行一次;若前方数组值为1,表示不能通过,继续判断其他方向是否可以通过,如mappoint_xpoint_y - 1 = 0则表示左侧可
19、以通过,direction=4,移动方向为左,入栈一次,其他方向的移动指令大致相同,都是先判断,在通过入栈实现移动游戏移动过程中若是未找到通路,需要返回,则执行InDirection反方向移动指令。其关键代码如下:int Hidding:Move_up(int mapHH,SqStack &S) if (mappoint_x - 1point_y = 7) mappoint_xpoint_y = 0; point_x -= 1; else if (mappoint_x - 1point_y = 0 & direction != 5) | mappoint_x - 1point_y = 3) /
20、如果前方可行 mappoint_xpoint_y = 7; point_x -= 1; Push(S, direction); if (mappoint_x - 1point_y = 1) if (mappoint_xpoint_y - 1 = 0) direction = 4; Push(S, direction); else if (mappoint_xpoint_y + 1 = 0) direction = 6; Push(S, direction); else dir_flage = Pop(S); InDirection(dir_flage); mappoint_xpoint_y =
21、 0; return 0;/Move_up6.游戏移动过程中若是未找到通路,需要返回的指令判断上一步执行的指令Key,在执行放方向移动的指令,具体代码如下:int Hidding:InDirection(int key) switch (key) case 8: direction = 5; break; case 4: direction = 6; break; case 5: direction = 8; break; case 6: direction = 4; break; default: break; return 0;/InDirection7.游戏的主循环用一个sleep函数控
22、制游戏的速度,具体代码如下:int Hidding:GameFunction(int mapHH, SqStack &S) Sleep(100); PrintMap(map); system(cls); while (!IsGameOver(map) mappoint_xpoint_y = 9; PrintMap(map); Move_Keys(direction, map,S); cout方向:; switch(direction) case 8: cout 上 endl; break; case 5: cout下; break; case 6: cout右; break; case 4:
23、cout左; break; cout direction endl; system(cls); Sleep(100); return 0;/GameFunction8.游戏的开始于结束游戏的主循环的类的实现表示游戏的开始,判断当前位置标记是否为3,如果为3,则表示该位置为终点,游戏结束,输出恭喜过关,提示是否查看通关路径,具体代码如下:int Hidding:Start() hid.GameFunction(map,S1); if (hid.IsGameOver(map) cout 恭喜过关! endl; cout输入2显示通关路径。endl; bool Hidding:IsGameOver(
24、int mapHH) if (mappoint_xpoint_y = 3) /3表示终点 return true; else return false;/IsGameOver9.迷宫地图的查看与通关后的路径查询开始游戏前可以查看迷宫的地图,在开始游戏寻找到通关路径后可以查看对应的路径,用for循环实现二维数组的读出,相应的通关路径会以符合标记出来,具体代码如下: for(int i=1;i=H;i+) for(int j=1;j=H;j+) if(mapij=0) coutmapij;五、设计总结 结论与心得本次课程设计题目为迷宫求解,通过该题目的设计过程,我们小组加深了对栈的逻辑结构,存储结
25、构及入栈出栈过程的理解,对栈的基本运算的实现有所掌握,对课本中所学的各种数据结构进一步理解和掌握,学会了如何把学到的知识用于解决实际问题,锻炼了自己动手的能力。本次课程设计,使我们对数据结构设计方法、步骤、思路,有一定的了解和认识,它相当于实际设计工作的模拟。在课程设计过程中,基本能按照规定的程序进行,先针对表达式算法为背景,建立系统模型:收集、调查有关资料,共同与老师和同学进行讨论、修改、再讨论、再修改,最后确定方案。一个人要完成所有的工作是非常困难和耗时的,我们小组都是分工合作,这样既锻炼了每个人,又学到了很多的知识。在以后的学习中我会更加注意各个方面的能力的协调发展。在课程设计时遇到了很
26、多的问题,在老师的帮助,和对各种资料的查阅中,将问题解决,培养了自主动手,独立研究的能力,为今后在学习工作中能更好的发展打下了坚实的基础。两周的课程设计很短暂,但其间的内容是很充实的,在其中我学习到了很多平时书本中无法学到的东西,积累了经验,锻炼了自己分析问题,解决问题的能力,并学会了如何将所学的各课知识融会,组织,来配合学习,两周中我们小组收益很大,学到很多。心得体会:通过此次课程设计,使我更加了解了数据结构着方面的知识,在设计的过程中遇到了一些很难的问题,经过一遍一遍地思考,与同学和老师的交流中找到了问题原因的所在,也知道了自己在这方面的知识欠缺和经验不足。通过这次的课程设计,获得了很多宝
27、贵的经验,特别是怎么样通过理论与实践相结合,把书本上的内容应用到我们做的程序上去。学会了调试程序的一般方法,知道了如何在困难重重中一步一步发现问题,解决问题。 五、参考文献1 郑莉,董渊,何江舟.C+语言程序设计(第4版)M.北京:清华大学出版社,2010:1231452 蔚敏,吴伟民.数据结构(C语言版)M.北京:清华大学出版社(范素珍 白立军),2007:1421603 吕凤翥.C+语言程序设计(第3版)M.北京:电子工业出版社,2009:1511754 陈小玉.趣学算法 M.北京:人民邮电出版社(张涛),2017.8:103-1155 严蔚敏,吴伟民,米宁.数据结构题集M.北京:清华大学出版社,105115
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1