迷宫问题非递归求解--数据结构c语言课程设计
东华理工大学 软件学院 软件工程系 1数据结构课程设计报告题目:迷宫问题非递归求解2010 年 6 月 4 日东华理工大学 软件学院 软件工程系 2目录 一. 实验内容………………………….3二. 需求分析……………………………3三.总体设计……………………………4四.详细设计……………………………6五.代 码……………………………10六. 测 试…………………………….15七. 总 结…………………………….17东华理工大学 软件学院 软件工程系 3一. 实验内容任务:可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;要求:二.需求分析1.可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;要求:使用非递归算法。2.用户可以根据自己的需求进行输入所需的迷宫,其中 1 表示迷宫的墙壁,0 表示迷宫的通路,从而建立自己的迷宫;3.用户还可以自己设计迷宫的入口坐标,当然也可以设计出口了;4.程序执行的命令包括:(1)构造栈 Stack, T 描述迷宫中当前位置的结构类型, LinkNode 链表结点三个类,其中 Stack是 Linknode 的友元类. (2)构造存取迷宫的二维指针 GetMaze(int 构造函数,置空栈操作结果:构造一个空的栈 S。Stack(); 析构函数 void Push(T e); 把元素 data 压入栈中T Pop(); 使栈顶元素出栈T GetPop(); 取出栈顶元素void Clear(); 把栈清空bool empty(); 判断栈是否为空,如果为空则返回 1,否则返回 0T类 迷宫中当前位置的结构类型: T 对象成员如下:x; x代表当前位置的行坐标y; y代表当前位置的列坐标dir; 0:无效,1:东,2: 南,3:西,4:北LinkNode类 链表结点 : 对象成员如下:友元类 StackT dataLinkNode *next东华理工大学 软件学院 软件工程系 8(三).函数调用关系mainGetMaze Mazepath Empy() GetPop() Push() PrintPath() Restore()Pop() GetPop() Push()(四 ) 算法的时间、空间复杂度1)本算法在空间上主要开辟了一个二维指针,规模都是迷宫(m+2)*(n+2),一个是栈,一个是迷宫路径记录,输出时候调用栈,在恢复迷宫。2)在时间上为简单的链表栈的存储结构,二维指针 GetMaze, Restore 两函数算法时间复杂度为 O((m+2)*(n+2) ), Mazepath,PrintPath 为 O(1),(m 为行数,n 为列数)。东华理工大学 软件学院 软件工程系 9(五 ) UML 图T+X:int+y:int+dir:intLinkNode+T dataStack+push(T e):void+T Getpop ( ):void+T pop ( )+empty ( ):bool+Stack ( )+~Stack ( )+Clear ( ):void+nextLinkNode LinkNode-top东华理工大学 软件学院 软件工程系 10五.代码/*以一个 m×n 的长方阵表示迷宫,0 和 1 分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j )指示迷宫中的一个坐标,d 表示走到下一坐标的方向。如:对于下列数据的迷宫,输出的一条通路为:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),…。*/#includeusing namespace std;class T //定义描述迷宫中当前位置的结构类型{public:int x; //x 代表当前位置的行坐标int y; //y 代表当前位置的列坐标int dir; //0:无效,1:东,2:南,3: 西,4:北};class LinkNode //链表结点{friend class Stack;public:T data;LinkNode *next;};class Stack{private:LinkNode *top; //指向第一个结点的栈顶指针public:Stack(); //构造函数,置空栈~Stack(); //析构函数void Push(T e); //把元素 data 压入栈中T Pop(); //使栈顶元素出栈T GetPop(); //取出栈顶元素void Clear(); //把栈清空bool empty(); //判断栈是否为空,如果为空则返回 1,否则返回 0};Stack::Stack() //构造函数,置空栈{top=NULL;}Stack::~Stack() //析构函数东华理工大学 软件学院 软件工程系 11{}void Stack::Push(T e) //把元素 x 压入栈中{LinkNode *P;P=new LinkNode;P-data=e;P-next=top;top=P;}T Stack::Pop() //使栈顶元素出栈{T Temp;LinkNode *P;P=top;top=top-next;Temp=P-data;delete P;return Temp;}T Stack::GetPop() //取出栈顶元素{return top-data;}void Stack::Clear() //把栈清空{top=NULL;}bool Stack::empty() //判断栈是否为空,如果为空则返回 1,否则返回 0{if(top==NULL) return 1;else return 0;}int move[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; //定义当前位置移动的 4 个方向bool Mazepath(int **maze,int m,int n); //寻找迷宫 maze 中从( 0,0)到(m,n)的路径//到则返回 true,否则返回 falsevoid PrintPath(Stack p); //输出迷宫的路径东华理工大学 软件学院 软件工程系 12void Restore(int **maze,int m,int n); //恢复迷宫int** GetMaze(int //获取迷宫//返回存取迷宫的二维指针int main(){int m=0,n=0; //定义迷宫的长和宽int