迷宫问题的求解的设计说明书

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

数据结构课程设计设计说明书迷宫问题的求解学生姓名学号班级成绩指导教师计算机科学与技术系2010年9月10日数据结构课程设计评阅书题目迷宫问题的求解学生姓名学号指导教师评语及成绩成绩:教师签名:年月日答辩教师评语及成绩成绩:教师签名:年月日教研室意见总成绩:室主任签名:年月日注:指导教师成绩60%,答辩成绩40%,总成绩合成后按五级制记入。课程设计任务书2010—2011学年第一学期专业:计算机科学与技术学号:姓名:课程设计名称:数据结构课程设计设计题目:迷宫问题的求解完成期限:自2010年08月30日至2010年09月12日共2周设计内容:用C/C++设计一个计算机程序对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。设计要求:1)问题分析和任务定义:根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么?(而不是怎么做?)限制条件是什么?确定问题的输入数据集合。2)逻辑设计:对问题描述中涉及的操作对象定义相应的数据类型,并按照以数据结构为中心的原则划分模块,定义主程序模块和各抽象数据类型。逻辑设计的结果应写出每个抽象数据类型的定义(包括数据结构的描述和每个基本操作的功能说明),各个主要模块的算法,并画出模块之间的调用关系图;3)详细设计:定义相应的存储结构并写出各函数的伪码算法。在这个过程中,要综合考虑系统功能,使得系统结构清晰、合理、简单和易于调试,抽象数据类型的实现尽可能做到数据封装,基本操作的规格说明尽可能明确具体。详细设计的结果是对数据结构和基本操作做出进一步的求精,写出数据存储结构的类型定义,写出函数形式的算法框架;4)程序编码:把详细设计的结果进一步求精为程序设计语言程序。同时加入一些注解和断言,使程序中逻辑概念清楚;5)程序调试与测试:采用自底向上,分模块进行,即先调试低层函数。能够熟练掌握调试工具的各种功能,设计测试数据确定疑点,通过修改程序来证实它或绕过它。调试正确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果;6)结果分析:程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。算法的时间、空间复杂性分析;7)编写课程设计报告;以上要求中前三个阶段的任务完成后,先将设计说明书的草稿交指导老师面审,审查合格后方可进入后续阶段的工作。设计工作结束后,经指导老师验收合格后将设计说明书打印装订,并进行答辩。指导教师(签字):教研室主任(签字):批准日期:年月日摘要设计了一个计算机程序对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。该程序按照以数据结构为中心的原则划分模块,定义主程序模块和各抽象数据类型,主程序包括构造一个空栈(InitStack)、设计迷宫(MakeMaze)、寻找迷宫路径(MazePath)、输出迷宫(Print)等模块。本程序采用VC++作为软件开发环境,采用了栈、结构体、数组来实现。操作简单,容易理解。关键词:迷宫;栈;数据结构目录1课题描述.......................................................12问题分析.......................................................23主要算法和流程图...............................................33.1主要算法..................................................33.2流程图....................................................44程序源代码.....................................................85运行结果......................................................136总结..........................................................15参考文献........................................................1611课题描述迷宫问题的求解通常用的是“穷举求解”的方法,即从入口出发,顺某一方向向前探索,若能走通,则继续往前走;否则沿原路退回,换另一个方向再继续探索,直至所有可能的通路都探索到为止。因此,在求迷宫通路的算法中需要一个后进先出的结构——“栈”。在迷宫求解问题的程序设计中求出一条从入口到出口的通路,或得出没有通路的结论。假设“当前位置”指的是“在搜索过程中某一时刻所在图中某个方块位置”,则求迷宫中一条路径的算法的基本思想是:若当前位置“可通”,则纳入“当前路径”,并继续朝“下一位置”探索,即切换“下一位置”为“当前位置”,如此重复直至到达出口;若当前位置“不可通”,则应顺着“来向”退回到“前一通道块”,然后朝着除“来向”之外的其他方向继续探索;若该通道块的四周四个方块均“不可通”,则应从“当前路径”上删除该通道块。所谓“下一位置”指的是“当前位置”四周四个方向(东、南、西、北)上相邻的方块。由此,“纳入路径”的操作即为“当前位置入栈”;“从当前路径上删除前一通道块”的操作即为“出栈”。迷宫问题的求解以VisualC++6.0作为开发工具。22问题分析迷宫问题的求解主要应用栈,栈的基本操作除了在栈顶插入或删除外,还有栈的初始化、判空及取栈顶元素等。栈的数据元素类型在应用程序内定义,并称插入元素的操作为入栈,删除栈顶元素的操作为出栈。本设计采用栈、结构体、数组实现迷宫问题的求解,主程序中包括初始化栈(InitStack)、入栈(PushStack)、出栈(PopStack)、留下足迹(FootPrint)、探索方向(NextPos)、判断足迹是否走过(Pass)、判断栈是否空(StackEmpty)、留下不能通过的标记(MarkPrint)、设计迷宫(MakeMaze)、寻找迷宫路径(MazePath)以及输出迷宫(Print)。程序设计中用到了if-else选择语句、if选择语句、switch控制语句、for循环语句、do-while循环语句以及while循环语句。33主要算法和流程图3.1主要算法求迷宫中一条从入口到出口的路径的算法可简单描述如下:设定当前位置的初值为入口位置;do{若当前位置可通,则{将当前位置插入栈顶;//纳入路径若该位置是出口位置,则结束;//求得路径存放在栈中否则切换当前位置的东邻块为新的当前位置;}否则,若栈不空且栈顶位置尚有其他方向未经探索,则设定新的当前位置为沿顺时针方向旋转找到的栈顶位置的下一相邻块;若栈不空但栈顶位置的四周均不可通;则{删去栈顶位置;//从路径中删去该通道块若栈不空,则重新测试新的栈顶位置,直至找到一个可通的相邻块或出栈至栈空;}43.2流程图本设计采用栈、结构体、数组实现迷宫问题的求解。下面给出迷宫问题的求解程序中下一步的探索方向(NextPos)、设计迷宫(MakeMaze)、寻找迷宫路径(MazePath)以及输出迷宫(Print)的流程图。其中图3.2.1为下一步的探索方向(NextPos)的流程图:开始sit&c,intdir,sitC;dir==1;dir==2;dir==3;dir==4;C.seatx=c.seatx;C.seaty=c.seaty+1;C.seatx=c.seatx+1;C.seaty=c.seaty;C.seatx=c.seatx;C.seaty=c.seaty-1;C.seatx=c.seatx-1;C.seaty=c.seaty;returnC;结束YYYYNNNN图3.2.1下一步的探索方向(NextPos)的流程图5图3.2.2为设计迷宫(MakeMaze)的流程图:图3.2.2设计迷宫(MakeMaze)的流程图开始inti,j;输入一个M*M的迷宫i=0;iM;j=0;jM;输入Maze[i][j];j++;i++;调用Print函数;结束NNYY6图3.2.3为寻找迷宫路径(MazePath)的流程图:开始StackS;findse;sitstart,end,curpos;intcurstep;调用函数InitStack;调用函数(Pass(curpos);调用函数FootPrint(curpos);留下足迹调用函数PushStack(S,e);加入路径curpos==end;探索下一步!StackEmpty(S);调用函数PopStack(S,e);e.di==4&&!StackEmpty(S);留下不能通过的标记,并退回一步e.di4;e.di++;换下一个方向探索;存在路径,到达终点结束!StackEmpty(S);YNNYNYNYNYYN不存在路径图3.2.3寻找迷宫路径(MazePath)的流程图7图3.2.4为输出迷宫(Print)的流程图:开始inti,j;i=0;iM;j=0:jM;Maze[i][j]==0;Maze[i][j]==1;Maze[i][j]==2;Maze[i][j]==3;标记标记■标记×标记㊣j++;i++;结束YYYYNNNNYYNN图3.2.4输出迷宫(Print)的流程图84程序源代码#includestdlib.h//引用库函数#includestdio.h#defineSTACK_INIT_SIZE300#defineSTACKINCREMENT20#defineM10//迷宫的最大坐标typedefintMazeType[M][M];typedefstruct{intseatx;intseaty;}sit;//迷宫坐标typedefstruct{intord;sitseat;intdi;//从此通道块走向下一通道块的方向}finds;//0:无效,1:东,2:南,3:西,4:北typedefstruct{finds*base;finds*top;intstacksize;}Stack;MazeTypeMaze;sitstart,end;//start,end入口和出口的坐标intInitStack(Stack&S)//构造一个空栈{S.base=(finds*)malloc(STACK_INIT_SIZE*sizeof(finds));if(!S.base)exit(1);S.top=S.base;S.stacksize=STACK_INIT_SIZE;return1;}voidPrint(){//输出迷宫inti,j;for(i=0;iM;i++){for(j=0;jM;j++){if(Maze[i][j]==0)printf();elseif(Maze[i][j]==1)printf(■);9elseif(Maze[i][j]==3)printf(×);elseif(Maze[i][j]==2)printf(㊣);}printf(\n);}}voidMakeMaze(){//设计迷宫inti,j;printf(\n======================欢迎进入迷宫游戏======================\n);printf(\n说明:由玩家输入一个迷宫,系统会在很短时间内判断出行走路径!\n);printf(\n\t\t\t祝您游戏愉快!\n);printf(\n======================GoodLuckToYou======================\n);printf(\n===请设计一个迷宫===\n);printf(\n输入一个%d*%d的迷宫【包括外墙】:\n,M,M);for(i=0;iM;i++)for(j=0;jM;j++)scanf(%d,&Maze[i][j]);printf(\n);printf(迷宫结构如下:\n);Print();}voidPushStack(Stac

1 / 21
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功