迷宫与栈课程设计报告范例
- 格式:doc
- 大小:546.00 KB
- 文档页数:23
数据结构课程设计――迷宫问题课程设计报告迷宫问题——王欣歆20080564一(需求设计:以一个m*m 的方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。
设计一个程序,对任意设定的迷宫,求出一条从入口的通道,或得出没有通路的结论。
二(概要设计:存储结构:采用了数组以及结构体来存储数据,在探索迷宫的过程中用到的栈,属于顺序存储结构。
/*八个方向的数组表示形式*/int move[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1, 1}};/*用结构体表示位置*/struct position{int x,y;};position stack[m*m+1];基本算法:走迷宫的过程可以模拟为一个搜索的过程:每到一处,总让它按东、东南、南、西南、西、西北、北、东北8个方向顺序试探下一个位置;如果某方向可以通过,并且不曾到达,则前进一步,在新位置上继续进行搜索;如果8个方向都走不通或曾经到达过,则退回一步,在原来的位置上继续试探下一位置。
每前进或后退一步,都要进行判断:若前进到了出口处,则说明找到了一条通路;若退回到了入口处,则说明不存在通路。
用一个字符类型的二维数组表示迷宫,数组中每个元素取值“0”(表示通路)或“1”(表示墙壁)。
迷宫的入口点在位置(1,1)处,出口点在位置(m,m)处。
设计一个模拟走迷宫的算法,为其寻找一条从入口点到出口点的通路。
二维数组的第0行、第m+1行、第0列、第m+1列元素全置成“1”,表示迷宫的边界;第1行第1列元素和第m行第m列元素置成“0”,表示迷宫的入口和出口;其余元素值用随机函数产生。
假设当前所在位置是(x,y)。
沿某个方向前进一步,它可能到达的位置最多有8个。
如果用二维数组move记录8个方向上行下标增量和列下标增量,则沿第i个方向前进y 一步,可能到达的新位置坐标可利用move数组确定: o x=x+move[i][0]y=y+move[i][1]从迷宫的入口位置开始,沿图示方向顺序依次进行搜索。
栈与迷宫的课程设计一、课程目标知识目标:1. 让学生理解栈的数据结构特点及其在实际问题中的应用;2. 使学生掌握使用栈解决迷宫问题的方法,包括迷宫的生成和路径寻找;3. 帮助学生建立栈与递归思想之间的联系,理解递归在解决迷宫问题中的作用。
技能目标:1. 培养学生运用栈解决实际问题的能力,特别是迷宫问题;2. 提高学生编写和调试解决迷宫问题的程序的能力;3. 引导学生通过小组合作,培养团队协作和问题解决技巧。
情感态度价值观目标:1. 激发学生对计算机科学和编程的兴趣,增强其学习动力;2. 培养学生面对复杂问题时保持耐心、细心的态度,勇于尝试和不断优化的精神;3. 增强学生的自信心,使其相信自己能够通过所学知识解决实际问题。
课程性质分析:本课程为中学信息技术或计算机科学相关课程,适用于有一定编程基础的学生。
通过结合栈与迷宫问题,使学生将理论知识应用于实践,提高解决问题的能力。
学生特点分析:考虑到学生年级和已有知识水平,课程设计将注重理论与实践相结合,逐步引导学生从简单到复杂的问题解决过程。
教学要求:1. 课程应注重启发式教学,引导学生主动探索和发现;2. 教师应关注学生个体差异,提供个性化指导;3. 教学过程中要充分体现学生的主体地位,鼓励学生积极参与讨论和分享。
二、教学内容1. 栈的基本概念与操作:回顾栈的定义、特点,掌握栈的出栈、入栈、栈空、栈满等基本操作。
相关教材章节:第二章 数据结构 第二节 栈与队列2. 迷宫问题分析:介绍迷宫问题的背景,分析问题解决的步骤,包括迷宫的表示、路径寻找等。
相关教材章节:第四章 算法应用 第三节 迷宫问题3. 栈在迷宫问题中的应用:讲解如何利用栈存储路径信息,解决迷宫问题。
相关教材章节:第四章 算法应用 第四节 栈与迷宫4. 递归思想与迷宫问题:介绍递归思想在解决迷宫问题中的应用,使学生理解递归的本质。
相关教材章节:第五章 递归算法 第二节 递归迷宫问题5. 编程实践:结合所学知识,编写解决迷宫问题的程序,进行调试和优化。
沈阳航空航天大学课程设计报告课程设计名称:数据结构课程设计课程设计题目:迷宫算法院(系):计算机学院专业:计算机科学与技术班级:学号:姓名:指导教师:目录1 课程设计介绍 (1)1.1课程设计内容 (1)1.2课程设计要求 (1)2 课程设计原理 (2)2.1课设题目粗略分析 (2)2.2原理图介绍 (3)2.2.1 功能模块图 (3)2.2.2 流程图分析 (4)3 数据结构分析 (8)3.1存储结构 (8)3.2算法描述 (8)4 调试与分析 (11)4.1调试过程 (11)4.2程序执行过程 (11)参考文献 (15)附录(关键部分程序清单) (16)1 课程设计介绍1.1 课程设计内容编写算法能够生成迷宫,并且求解迷宫路径(求解出任意一条到出口的路径即可):1.迷宫用上下左右四种走法;2.迷宫的大小和复杂程度可以由用户定义;3.入口出口也由用户自己选择。
1.2 课程设计要求1.不必演示求解过程,只需要输出迷宫求解的路径;2.参考相应资料完成课设。
2 课程设计原理2.1 课设题目粗略分析根据课设题目要求,拟将整体程序分为四大模块。
以下是四个模块的大体分析:1 建立迷宫:要建立迷宫首先就要建立存储结构,这里我用栈的方式建立的。
根据用户输入的迷宫的大小(我设置的最大值为25可以根据要求调解);2 设置迷宫:这里将0设置围墙,1是可以通过的路径,-1是不可以通过路径,外墙是以设计好的,内墙需要用户来设置,障碍的难度可由用户自行定义;3 寻找路径:寻找路径我设置了四个方向{0,1},{1,0},{0,-1},{-1,0}移动方向,依次为东南西北,首先向东走,若不成功则转换方向,成功则继续前进,将走过的路径进行标记,然后存入栈中;4 输出结果:输出的结果分为两种,一种是用户建立的迷宫主要是让用户检查是否符合要求,第二种输出的是寻找完后的路径,路径用1 2 3 4···来表示。
课程设计报告(论文)报告(论文)题目:迷宫问题哈夫曼编码/译码实现作者所在系部:计算机科学与工程系作者所在专业:网络工程所在班级:作者姓名:作者学号:指导教师姓名:完成时间:北华航天工业学院教务处制摘要在当前的市场经济体制下,企业要想提高市场的竞争力,不但要有好的产品,同时也要有好的信息查询系统,以实现企业高效率的管理及查询。
在本次课程设计中,主要解决的问题就是迷宫问题和利用创建的哈夫曼树进行编码/译码,运用C++语言编写的程序。
在迷宫问题中,可由操作者自己设计迷宫的内部构造,迷宫的入口点已被社定。
操作者自己社定迷宫出口点,当操作者输入的出口点超出迷宫本身的时候,做出提示:输入有误,请操作者再次输入迷宫出口点。
根据操作者输入的出口点求出走出迷宫的一条路径。
如果能走出迷宫,再求解最短路径。
操作者可再次设置迷宫的出口点,采取相同的操作。
该程序已经过全面的系统测试,能够很好的运行,达到了预期的效果。
哈夫曼编码/译码系统主要有五个功能模块:1:创建哈夫曼树;2:打印哈夫曼编码规则;3:规则根据编码规则进行编码,并将编码保存在D:code1file.dat文件中;4:对保存在code1file.dat文件中的二进制代码进行译码,并将译码保存在D:code2file.dat文件中;5:打印哈夫曼编码。
该程序已经过全面的系统测试,能够很好的运行,达到了预期的效果。
例如:无效数字的输入本系统的自动判断,按照不同的关键字输出结果,人性化的输入界面(包括输入提示,错误提示等等)。
在下面各章节的介绍中,你会了解到各程序的具体设计与实现,介绍中包括系统需求分析,概要设计,详细设计,调试分析以及测试记过等。
此次程序设计使我们进一步了解C++的精华之处及数据结构的一些编程思想。
C++是优秀的计算机程序设计语言,它的功能相当的强大。
C++是程序设计员必备的一种语言,本次课程设计帮助我们深入的了解了C++的精髓所在,为我们以后的学习打下了坚实的基础。
课程设计报告课程名称:数据结构报告题目:迷宫求解学生姓名:XX所在学院:信息科学与工程专业班级:软件工程学生学号:XXXXXXXXXXX指导教师:XXX课程设计任务书摘要本程序主若是求迷宫中从人口到出口的所有途径是一个经典的程序设计问题。
运算机解迷宫时,通经常使用的是“穷举求解”的方式,即从入口动身,顺某一方向向前探讨,假设能走通,那么继续往前走;不然沿原路返回,换一个方向在继续探讨,直至所有可能的通路都探讨完为止。
当前位置“可通”,那么纳入“当前途径”,并继续朝“下一名置”探讨,即切换为“下一名置”为“当前位置”,如此重复直至抵达出口;假设当前位置“不可通”,那么应顺着“来的方向”退回到“前一通道块”,假设该通道块的周围4个方块均“不可通”那么应从当前途径删除该通道块。
所谓“下一名置”指的是“当前位置”周围4个方向(东、南、西、北)上相邻的方块。
以栈S来记录“当前途径”,那么栈顶中寄存的是“当前途径上最后一个通道块”。
因此即为“当前途径入栈”;“从当前途径上删除前一通道块”为“出栈”。
在那个进程中能够输出迷宫所走通的途径,在这次课程设计中迷宫是由数组预先概念好的,不能由用户概念生成,能够加入随机函数,自动生成二维数组,还能够用户自己输入迷宫。
关键词:栈;存储结构;数组目录目录 (3)一、课题分析 (1)二、需求分析 (1)1. 主模块功能描述 (1)2. 子程序模块设计 (1)三、设计方案 (1)1.类设计 (1)int point_x; 序模块设计 (2)设计方案与实施与整体设计思想 (2)3. 主模块 (3)子模块 (4)主菜单 (5)功能A模块 (5)功能B模块 (5)功能C模块 (6)四、详细设计 (7)1.用结构体构建栈 (7)SElemType *top; 建类 (7)int point_x; 数组构建一个迷宫 (7)case 1: 戏移动操纵指令 (8)}戏移动操纵指令四个方向的实现 (8)else if ((map[point_x - 1][point_y] == 0 && direction != 5) || map[point_x - 1][point_y] == 3) 戏移动进程中假设是未找到通路,需要返回的指令 (9)}戏的主循环 (9)}戏的开始于终止 (10)if (map[point_x][point_y] == 3) 宫地图的查看与通关后的途径查询 (10)五、设计总结 (11)结论与心得 (11)五、参考文献 (12)一、课题分析(1)该题目为迷宫求解。
二、课程设计内容(含技术指标)【问题描述】以一个mXn的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。
设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
【任务要求】首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。
求得的通路以三元组(i,j,d)的形式输出。
其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。
如,对于下列数据的迷宫,输出一条通路为:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),…。
编写递归形式的算法,求得迷宫中所有可能的通路。
以方阵形式输出迷宫及其通路。
【测试数据】迷宫的测试数据如下:左上角(0,1)为入口,右下角(8,9)为出口。
出口出口四、基本要求1.在设计时,要严格按照题意要求独立进行设计,不能随意更改。
若确因条件所限,必须要改变课题要求时,应在征得指导教师同意的前提下进行。
2.在设计完成后,应当场运行和答辩,由指导教师验收,只有在验收合格后才能算设计部分的结束。
3.设计结束后要写出课程设计报告,以作为整个课程设计评分的书面依据和存档材料。
设计报告以规定格式的电子文档书写、打印并装订,报告格式严格按照模板要求撰写,排版及图、表要清楚、工整。
从总体来说,所设计的程序应该全部符合要求,问题模型、求解算法以及存储结构清晰;具有友好、清晰的界面;设计要包括所需要的辅助程序,如必要的数据输入、输出、显示和错误检测功能;操作使用要简便;程序的整体结构及局部结构要合理;设计报告要符合规范。
课程负责人签名:2011年7月1日迷宫与栈问题摘要数据结构是研究与数据之间的关系,是互相之间一种或多种特定关系的数据元素的集合,我们称这一关系为数据的逻辑结构。
数据结构在计算机的表示(又称映像)称为数据的物理结构,又称存储结构。
本次课程设计是迷宫求解问题,主要是模拟从入口到出口的通路。
程序中的数据采取的是“栈”作为数据的逻辑结构,并且使用链式存储结构,即是实现一个以链表作存储结构的栈类型。
数据结构实验报告题目:用栈解决迷宫问题一.需求分析1.以结构体Maze表示迷宫,其中pos表示该位置是否有障碍; freq记录该位置被经过的次数;数组move表示下一步的方向。
2.本程序自动随机生成一个12×12大小的迷宫,字符“H”表示有障碍,空符表示通路。
3.迷宫的入口为左上角,出口为右下角。
4.本程序只求出一条成功的通路。
二.概要设计为了实现上述操作,以栈为存储结构。
本程序包含三个模块:(1)主程序模块:实现人机交互。
(2)迷宫生产模块:随机产生一个12×12的迷宫。
(3)路径查找模块:实现通路的查找。
(4)求解迷宫中一条通路的伪代码:do{若当前位置可同,则{将当前位置插入栈顶;若该位置是出口位置,则结束;否则切换当前位置的东临方块为新的当前位置;}否则{若栈不空且栈顶位置尚有其他方向未被探索,则设定新的的当前位置为沿顺时针方向旋转找到的栈顶位置的下一相邻块若栈不空但栈顶位置的四周均不可通,则{删去栈顶位置;若栈不空,则重新测试新的栈顶位置,直至找到一个可通的相邻块或出栈至栈空。
}}} while(栈不空)三.详细设计栈的设计:typedef struct{Node *base,*top;int length;}Stack;Stack *initstack(); //初始化栈void printstack(Stack *s); //打印栈Status destroy(Stack *); //销毁整个栈Status deltop(Stack *s); //出栈Status pushelem(Stack *,ElemType ,ElemType); //进栈1. 主程序模块:int main(){printf("随机产生一个12×12的迷宫,X字符表示障碍,空符表示通路:\n");Maze a[N][N];makemaze(a);printf("输入回车键显示路径,*字符表示路径。
c 课程设计报告迷宫一、教学目标本课程的教学目标是让学生掌握迷宫问题的基本概念、算法和编程技巧。
通过本课程的学习,学生应能理解迷宫问题的数学模型,掌握常用的迷宫算法,并能够运用编程语言实现迷宫的求解。
此外,学生还应培养解决问题的能力和创新思维,提高对计算机科学和编程的兴趣。
具体来说,知识目标包括:1.了解迷宫问题的背景和应用场景。
2.掌握迷宫问题的数学模型和基本概念。
3.熟悉常用的迷宫算法及其特点。
4.理解编程语言在解决迷宫问题中的应用。
技能目标包括:1.能够运用迷宫算法求解简单迷宫问题。
2.能够运用编程语言实现迷宫算法的求解。
3.能够对迷宫算法进行优化和改进。
情感态度价值观目标包括:1.培养学生对计算机科学和编程的兴趣。
2.培养学生解决问题的能力和创新思维。
3.培养学生的团队合作意识和沟通能力。
二、教学内容本课程的教学内容主要包括迷宫问题的基本概念、算法和编程技巧。
具体内容包括:1.迷宫问题的背景和应用场景。
2.迷宫问题的数学模型和基本概念。
3.常用的迷宫算法及其特点。
4.编程语言在解决迷宫问题中的应用。
教学大纲安排如下:第一课时:介绍迷宫问题的背景和应用场景,引入迷宫问题的数学模型和基本概念。
第二课时:介绍常用的迷宫算法及其特点,引导学生理解编程语言在解决迷宫问题中的应用。
第三课时:通过案例分析,让学生运用迷宫算法求解简单迷宫问题,培养学生的编程能力。
第四课时:引导学生对迷宫算法进行优化和改进,提高学生的解决问题的能力。
第五课时:进行课程总结和回顾,让学生展示自己的迷宫求解成果,进行交流和评价。
三、教学方法本课程的教学方法采用讲授法、讨论法和实验法相结合的方式。
通过讲授法,向学生传授迷宫问题的基本概念、算法和编程技巧;通过讨论法,引导学生进行思考和交流,培养学生的创新思维;通过实验法,让学生动手实践,培养学生的编程能力和解决问题的能力。
在教学过程中,教师应根据学生的实际情况,灵活运用不同的教学方法,以激发学生的学习兴趣和主动性。
目录引言 (1)一.设计目的 (2)二.问题描述 (2)三.需求分析 (3)四.设计 (3)五.测试分析 (5)六.完整代码 (10)七.设计体会与小结 (17)八、成绩: (17)引言数据结构的学习过程,是进行复杂程序设计的训练过程,是算法构造性思维方法的训练过程,技能培养的过程不亚于知识传授。
数据结构课程教学的重要内容和主要难点在于让我们理解、习惯算法构造性思维方法。
培养我们的数据抽象能力、算法设计能力以及创造性思维方法,才能够举一反三、触类旁通,从而达到应用知识解决复杂问题的目的。
数据结构作为专业基础课程,可以对去年学习的c语言知识进行总结提高,为后续专业基础课程提供基础,它承上启下,贯通始终,是计算机科学与技术人才素质框架中的脊梁,对我们能力的培养至关重要。
通过对数据结构的学习,我们能够以问题求解方法、程序设计方法及一些典型的数据结构算法为对象,学会分析数据对象特征,掌握数理算法,初步掌握算法的时间、空间复杂分析基础,培养良好的程序设计风格以及进行复杂程序设计的技能。
一.设计目的这次课程设计,我们的题目是迷宫求解。
迷宫求解是数据结构中的经典问题,我期望达到的目的有以下4个。
1.巩固书本知识,对书上的知识能更透彻的了解.通过自己设计程序积累调试数据结构的经验,培养我们的编程能力。
巩固我们所学的数据结构知识,消化课堂所讲解的内容。
也是对所学知识的整理,将原来在我们脑中比较混乱的课程设计重新梳理。
2.通过课程设计能更好的掌握迷宫求解中的设计思路,为以后灵活运用奠定基础。
3.能够独立的完成简单程序的设计以及完成一份较为满意的程序设计报告。
4.通过课程设计达到增强巩固数据结构知识的目的,使知识全面化、系统化。
二.问题描述迷宫问题来源于古希腊的神话,而后被人们演化为一个游戏。
以一个N*M的方正表示迷宫,0、1分别表示迷宫中的通路和障碍。
设计一个程序对任意设定的迷宫求出一条从入口的通道,或者的出没有通路的结论。
数据结构实验报告实验名称:实验二——利用栈结构实现迷宫求解问题学生姓名:班级:班内序号:学号:日期:2012年11月19日一、实验目的1、进一步掌握指针、模板类、异常处理的使用2、掌握栈的操作的实现方法3、掌握队列的操作的实现方法4、学习使用栈解决实际问题的能力5、学习使用队列解决实际问题的能力二、实验要求:利用栈结构实现迷宫求解问题。
迷宫求解问题如下:心理学家把一只老鼠从一个无顶盖的大盒子的入口赶进迷宫,迷宫中设置很多隔壁,对前进方向形成了多处障碍,心理学家在迷宫的唯一出口放置了一块奶酪,吸引老鼠在迷宫中寻找通路以到达出口,测试算法的迷宫如下图所示。
提示:1、可以使用递归或非递归两种方法实现2、老鼠能够记住已经走过的路,不会反复走重复的路径3、可以自己任意设置迷宫的大小和障碍4、使用“穷举求解”的方法三、程序分析1、存储结构栈存储结构;示意图;2、关键算法分析A、绘制迷宫;伪代码:1、输出迷宫的大小及全部设置为障碍;2、根据键盘的输入绘制迷宫的路线,起始点和终点;void draw()//绘制迷宫障碍{k=getch();switch(int(k)){case 105://上if(by>5){by--;j--;}break;case 107://下if(by<M+4){by++;j++;}break;case 106://左if(bx>2){bx=bx-2;i--;}break;case 108://右if(bx<2*N){bx=bx+2;i++;}break;case 114://'R'路map[i][j]=0;cout<<".";break;case 119://'W'墙map[i][j]=-3;cout<<"■";break;case 115://'S'起点s[0].x=i;//起点入栈s[0].y=j;top=1;map[i][j]=-1;cout<<k;break;case 101://'E'终点map[i][j]=-2;cout<<k;break;}gotoxy(bx,by);}B、路径寻找伪代码;1、向某一方向查找是否有路;2、如有遍历一下栈,看是否已经进栈,一进栈就舍弃,寻求下一个;无就让其进栈。
(此文档为word格式,下载后您可任意编辑修改!)北京理工大学珠海学院课程设计说明书_2014_—_2015_学年第_一_学期题目: 迷宫与栈学院:计算机学院专业班级:软件工程x班学号 x学生姓名: XXX指导教师:何春香成绩:时间:2014年 11 月 7日附件4:北京理工大学珠海学院课程设计任务书2014 ~2015 学年第学期学生姓名:专业班级:指导教师:何春香工作部门:软件工程教研室一、课程设计题目迷宫与栈问题二、课程设计内容(含技术指标)【问题描述】以一个mXn的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。
设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
【任务要求】首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。
求得的通路以三元组(i,j,d)的形式输出。
其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。
如,对于下列数据的迷宫,输出一条通路为:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),…。
编写递归形式的算法,求得迷宫中所有可能的通路。
以方阵形式输出迷宫及其通路。
【测试数据】迷宫的测试数据如下:左上角(0,1)为入口,右下角(8,9)为出口。
出口出口三、进度安排1.初步设计:写出初步设计思路,进行修改完善,并进行初步设计。
2.详细设计:根据确定的设计思想,进一步完善初步设计内容,按要求编写出数据结构类型定义、各算法程序、主函数。
编译分析调试错误。
3.测试分析:设计几组数据进行测试分析,查找存在的设计缺陷,完善程序。
4.报告撰写:根据上面设计过程和结果,按照要求写出设计报告。
5.答辩考核验收:教师按组(人)检查验收,并提出相关问题,以便检验设计完成情况。
四、基本要求1.在设计时,要严格按照题意要求独立进行设计,不能随意更改。
若确因条件所限,必须要改变课题要求时,应在征得指导教师同意的前提下进行。
2.在设计完成后,应当场运行和答辩,由指导教师验收,只有在验收合格后才能算设计部分的结束。
3.设计结束后要写出课程设计报告,以作为整个课程设计评分的书面依据和存档材料。
设计报告以规定格式的电子文档书写、打印并装订,报告格式严格按照模板要求撰写,排版及图、表要清楚、工整。
从总体来说,所设计的程序应该全部符合要求,问题模型、求解算法以及存储结构清晰;具有友好、清晰的界面;设计要包括所需要的辅助程序,如必要的数据输入、输出、显示和错误检测功能;操作使用要简便;程序的整体结构及局部结构要合理;设计报告要符合规范。
课程负责人签名:2014年 11月7日迷宫与栈问题摘要数据结构是研究与数据之间的关系,是互相之间一种或多种特定关系的数据元素的集合,我们称这一关系为数据的逻辑结构。
数据结构在计算机的表示(又称映像)称为数据的物理结构,又称存储结构。
本次课程设计是迷宫求解问题,主要是模拟从入口到出口的通路。
程序中的数据采取的是“栈”作为数据的逻辑结构,并且使用链式存储结构,即是实现一个以链表作存储结构的栈类型。
本课程设计实现了链栈的建立,入栈,出栈,判断栈是否为空的方法,关键的是迷宫通路路径的“穷举求解”和递归求解的方法。
本课程设计重要说明了系统的设计思路、概要设计以及各个功能模块的详细设计和实现方法。
本次程序的开发工具是microsoft visual studio 2008,编程语言是C语言。
关键词:迷宫求解链栈穷举求解递归求解目录摘要 (IV)1需求分析 (1)1.1基本原理分析 (1)1.2功能要求 (1)2 概要设计 (2)2.1数据结构及其抽象数据类型的定义 (2)2.1.1栈的抽象数据类型 (2)2.1.2迷宫的抽象数据类型 (2)2.1.3功能模块分解 (3)3 详细设计 (4)3.1主函数与各功能模块 (4)3.2迷宫路径模块 (4)3.2.1算法分析 (4)3.2.2流程图 (5)4软件测试 (6)4.1调试过程中遇到的问题的解决,以及程序设计思想的实现 (6)4.2测试数据 (6)4.3测试结果 (7)4.4结果分析 (8)参考文献 (8)心得体会 (9)1.需求分析1.1基本原理分析迷宫问题通常是用“穷举求解”方法解决,即从入口出发,顺着某一个方向进行探索,若能走通,则继续往前走;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。
假如所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。
栈是一个后进先出的结构,可以用来保存从入口到当前位置的路径。
定义迷宫类型来存储迷宫数据,通常设定入口点的下标为(1,1),出口点的下标为(n,n)。
为处理方便起见,在迷宫的四周加一圈障碍。
对于迷宫任何一个位置,均约定东、南、西、北四个方向可通。
1.2功能要求(1)以一个mXn的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。
迷宫的四周有一圈障碍。
(2)程序输出的结果以三元组(i,j,di)的形式输出,其中:(i,j)指示迷宫中的一个坐标,di表示走到下一坐标的方向,di的取值为1、2、3、4分别表示东、南、西、北(3)程序能够输出一个任意的迷宫从指定入口到出口的所有通路,以及以方阵形式输出迷宫(4)若设定的迷宫存在通路,则以方阵形式将迷宫及其通路输出到标准输出文件上,其中字符“1”表示障碍,“2”表示路径,“3”表示曾途经该位置但不能到达出口,其余位置用0表示。
若设定迷宫不存在通路则报告相应信息2.概要设计2.1数据结构及其抽象数据类型的定义2.1.1栈的抽象数据类型ADT LinkStack{数据对象:D={ai| ai∈CharSet,i=1,2…n,n>=0}数据关系:R1={<ai-1, ai >| ai-1, ai∈D,i=2,…n}基本操作:InitLinkStack(&S)操作结果:构造一个空栈S。
LinkStackEmpty(&S)初始条件:栈S已存在。
操作结果:若S为空栈,则返回TRUE,否则返回FALSE。
PushLinkStack (&S,e)初始条件:栈S已存在。
操作结果:在栈S的栈顶插入新的栈顶元素e。
PopLinkStack (&S,&e)初始条件:栈S已存在。
操作结果:删除S的栈顶元素,并以e返回其值。
} ADT LinkStack2.1.2迷宫的抽象数据类型ADT Maze{数据对象:D={ai,j| ai,j∈{},0<=i<=m-1,0<=j<=n-1,m,n<=10}数据关系:R={row,line}基本操作:InitMaze(&maze)初始条件:用迷宫类型Maze.arr[row][line]表示迷宫,迷宫的数据由用户自己定义,并且以值0表示通路,以值1表示障碍。
操作结果:构成迷宫的数字型数组,以0表示通路,以1表示障碍。
MazePath(&maze,start,end)初始条件:迷宫S已被赋值。
操作结果:若迷宫S中存在一条通路,则按如下规定改变迷宫S的状态:以2表示路径上的位置,以3表示死胡同;否则迷宫的状态不变。
MazePath_Recursion(&maze,cur,end,curstep)初始条件:迷宫S已被赋值。
操作结果:若迷宫S中存在通路,输出迷宫的可能路径。
PrintMaze(Maze)初始条件:迷宫M已经存在操作结果:以方阵形式输出迷宫。
}ADT Maze;2.1.3功能模块分解(1) 主程序模块:void main(){初始化;While(1){接受命令;处理命令;}}(2) 栈模块------实现栈的抽象数据类型typedef struct Stacknode{SElemType data;struct Stacknode *next;}*LinkStack;调用函数:InitLinkStack(),LinkStackEmpty(),PushLinkStack(),PopLinkStack() (3)迷宫模块----实现迷宫抽象数据类型typedef struct{int row;int line;}PosType;迷宫中row行line列的位置typedef struct MazeType{int row;int line;int arr[MAXLEN][MAXLEN];}MazeType; 迷宫类型typedef struct{int ord; 当前位置在路径上的“序号”PosType seat; 当前的坐标位置int di; 往下一坐标位置的方向}SElemType;调用函数:Pass(),FootPrint(),MarkPrint(),NextPos(),MazePath()或MazePath_Recursion(),PrintMaze().各个模块之间的调用关系如下:主程序模块->迷宫模块->栈模块3.详细设计3.1主函数与各功能模块主函数的各函数调用关系如图3-1所示,主函数调用创建迷宫函数和求解所有路径的函数,其中创建迷宫信息的函数调用初始化迷宫和输出迷宫。
图3-13.2 迷宫路径模块3.2.1算法分析解决迷宫问题最重要的程序段是找到通路,并存储在栈里,现只分析实现这一过程的函数do {若当前位置可通,则{ 将当前位置插入栈顶;若该位置是出口位置,则结束;否则切换当前位置的东邻方块为新的当前位置;}否则,若栈不空且栈顶位置尚有其他方向未经探索,则设定的新的当前位置为沿顺时针方向旋转找到的栈顶位置的下一相邻块;若栈不空但栈顶位置的四周均不可通,则{ 删去栈顶位置;若栈不空,则重新测试新的栈顶位置,直到找到一个可通的相邻块或出栈至栈空;}}while(栈不空);3.2.2 流程图图3-24.软件测试4.1调试过程中遇到的问题的解决,以及程序设计思想的实现(1)调试过程中出现的错误有编译连接时的一些语法错误,也有由于算法存在问题而导致程序运行没有结果或者不是预期的结果。
这里主要说一下自己由于算法而导致的错误:因为没有注意结点不能重复走,所以造成了死循环,程序没有结果。
通过分析后把走过的结点变为不可走的结点,这样就避免了重复走到该结点。
还有就是判断迷宫是否有通路的这个结果不能如预期的结果那样:有通路就输出所有的通路,没有就输出“没有路径可走!”。
因为没有通路可走的时候栈是空的,但是输出所有的路径以后栈也是空的。
当迷宫有通路的时候,在输出所有路径以后还是会输出“没有路径可走!”这句话。
当迷宫没有通路的时候,输出“没有路径可走!”这句话。
因为算法的思想是这样的,所以达不到预期的结果。
解决的方法是如果迷宫有通路则输出所有的通路,如果迷宫没有通路,则没有结果输出。