迷宫与栈问题.docVIP

  • 10
  • 0
  • 约7.97千字
  • 约 14页
  • 2019-08-06 发布于江西
  • 举报
PAGE 目录 TOC \o 1-2 \h \z \u 一、 系统开发的背景 1 二、 系统分析与设计 1 (一) 系统功能要求 1 (二) 系统模块结构设计 1 三、 系统的设计与实现 2 (一) 栈的基本操作 2 (二) 迷宫算法:path(SeqStack *s) 4 (三) 迷宫路径输出算法:printpath(SeqStack *s) 6 (四) 主函数 7 四、 系统测试 8 (一) 测试主函数迷宫的输入输出 8 (二) 测试迷宫函数和迷宫路径输出函数 8 五、 总结 9 六、 附件(代码) 9 PAGE 13 迷宫与栈问题 系统开发的背景 迷宫问题是心理学中的一个经典问题,一直以来人们乐都此不彼的研究它。 同样利用栈的思想也可以解决迷宫问题。 系统分析与设计 系统功能要求 以一个mXn的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出。其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。 系统模块结构设计 通过对系统功能的分析,系统功能如图1所示。 迷宫与栈问题 迷宫与栈问题 栈的基本操作 迷宫算法 主 函数 迷宫路径输出 图1 迷宫与栈问题系统功能图 通过上图的功能分析,把整个系统划分为4个模块: 1、栈的基本操作:该模块主要包括栈的初始化、栈空判别算法、入栈算法、出栈算法;主要通过函数SeqStack *Init_SeqStack()、Empty_SeqStack(SeqStack *s)、Push_SeqStack(SeqStack *s,DateType x)、pop_SeqStack(SeqStack *s,DateType *x)实现; 2、迷宫算法:该模块主要通过函数path(SeqStack *s)实现, 3、迷宫路径输出算法:该模块主要通过函数 printpath(SeqStack *s)实现; 4、主函数:该模块主要是迷宫的输入、打印,以及对以上函数的调用。 系统的设计与实现 栈的基本操作 分析:栈的初始化算法也可理解为置空栈算法:首先建立栈空间,然后初始化栈顶指针。利用if来判断是否申请到足够大的储存空间,然后返回空指针或栈空间地址;栈空判别算法:当栈顶指针指向栈底时,栈为空;入栈算法:入栈时,首先借助if语句判断栈是否满了,栈满时,不能入栈,返回错误代码0,相反,栈顶指针向上移动,将x置于新的栈顶,入栈成功返回成功代码1;出栈算法:出栈时,首先判断栈是否为空,借助于if语句,栈空不能出栈,返回错误代码0,相反,保存栈顶元素值,栈顶指针向下移动 ,栈顶元素存入*x,返回成功代码1;该模块如图2所示: 栈的基本操作 栈的基本操作 栈的初始化 栈空判别算法 入栈操作 出栈操作 图2 栈的基本操作 该模块的具体代码如下所示: //栈的初始化算法 SeqStack *Init_SeqStack(){ SeqStack *s; s=(SeqStack *)malloc(sizeof(SeqStack)); s-top=0; return s; } //栈空判别算法 int Empty_SeqStack(SeqStack *s){ if(s-top==0) //判断空栈 return 1; else return 0; } //入栈算法 int Push_SeqStack(SeqStack *s,DateType x){ if(s-top==Maxsize-1) //判断栈满 return 0; else{ s-top++; s-data[s-top]=x; return 1; } } //出栈算法 int pop_SeqStack(SeqStack *s,DateType *x){ if(Empty_SeqStack(s)) return 0; else{ *x=s-data[s-top]; s-top--; return 1; } } 迷宫算法:path(SeqStack *s) 分析:从迷宫入口出发,按照一定的顺序(在本程序中顺序依次为右、右下、下、左下、左、左上,上、右上)对周围的墙、路进行判断;若周围的位置都为1(即没有通路),则沿原路返回前一点,换下一个方向继续试探,直到所有通路都试探到,或找到一条通路,或无路可走又返回到入口点。在求解过程中,为了保证在到达某一点后不能向前继续行走时,能正确返回前一点,以便继续从下一

文档评论(0)

1亿VIP精品文档

相关文档