1、计算机解迷宫问题通常用的是“穷举求解”方法,即从入口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。假如所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。迷宫的入口点的下标为(1,1) ,出口点的下标为(m,n) 。为处理方便起见,可在迷宫的四周加一圈障碍。对于迷宫的任一位置,均可约定有东、南、西、北四个方向可通。有一种简单走出迷宫的方法,把手放在右边的墙上开始前进,始终不要把手从墙上移开。如果迷宫向右拐,你也顺着墙向右拐。只要不把手从墙上移开,最终就会到达迷宫的出口。当然这样得到的路径可能不是一个最短的路径,
2、但它可以最终得到结果,换句话说,这种方法走不出迷宫的风险是最小的。本设计是为了实现一个可视化迷宫,以及利用最短路径算法寻找迷宫的出路以及将最短路径打印在屏幕上,并且限制小老鼠不能穿越墙,只能在路径上移动。而且可以根据自己的需要设计迷宫地图。关键词 迷宫;栈;VC+ 6.0 目录1 课设题目 11.1 课设题目.11.2 基本要求:.11.3 需求分析12 程序总体设计 22.1 流程图:.22.2 概要设计.62.3 运行结果及分析7总结 9源程序 10参考文献 2011 课设题目1.1课设题目编写一个程序求解迷宫问题。迷宫由 m 行 n 列的二维数组设置,0 表示无障碍,1 表示有障碍。设入
3、口为(1,1) ,出口为(m,n) ,每次只能从一个无障碍单元移到周围四个方向上任一无障碍单元。编程实现对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。算法输入:代表迷宫入口的坐标算法输出:穿过迷宫的结果。算法要点:创建迷宫,试探法查找路径,输出解1.2基本要求:1.求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d 表示走到下一个坐标的方向。2.输出迷宫示意图1.3 需求分析1、本程序实现迷宫的探索过程. 以用户和计算机对话的方式,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,然后程序就探索路径并输出路
4、径。 2、本演示程序中,输入形式以“回车符”为结束标志,且允许出现重复字符。3、利用二维指针实现迷宫位置的存储,并用栈存贮探索路径,每个结点含三个整形变量。输入的形式以回车结束。4、本程序中,用户可以读去文件里的迷宫,也可自己重新输入迷宫,而且用户可以输入任意大小的迷宫,然后程序自动探索路径,并输出迷宫的路径。22 程序总体设计2.1流程图:1.功能结构图Main 主函数模块获取迷宫模块 探索路径模块Findpath()输出路径模块printpath()读文件Readfile()写文件Writefile()存储探索路径模块 stack类Stack 类结点数据类型模块datatype 类取栈顶函
5、数getpop()进栈与出栈函数push()Pop()清空函数clear()结点模块Node*top操作模块数据模块构造与析构函数stack()stack()盘空函数isempty()32.画出主要数据结构的类图class 类名 DataType /定义描述迷宫中当前位置的类型访问控制权限 数据类型 变量名; 数据成员public:int x; /x代表当前位置的行坐标int y; /y代表当前位置的列坐标int dir; /dir表示移动到下一步的方向class 类名 Move /定义下一个位置的方向访问控制权限 数据类型 变量名; 数据成员public:int x; int y;class
6、 类名 Node /结点访问控制权限 数据类型 变量名; 数据成员public:DataType data;Node *next;class 类名 stack访问控制权限 数据类型 变量名; 数据成员private:Node *top; /指向第一个结点的栈顶指针访问控制权限 返回值类型 函数名(参数列表) 成员函数public:stack(); /构造函数,置空栈stack(); /析构函数void Push(DataType data);/把元素 data压入栈中DataType Pop(); /使栈顶元素出栈DataType GetPop(); /取出栈顶元素void Clear();
7、/把栈清空bool IsEmpty(); /判断栈是否为空,如果为空则返回 1,否则返回 043.main 函数流程图开始退出显示系统信息选择获取迷宫的方式 chCh= bCh=aReadfile()文件读取输出迷宫路径自行输入Writefile()探索迷宫路径是否存在是否继续游戏52.探索路径函数 findpath()开始Temp1.x=1Temp1.y=1P q 栈顶是否相等入口进栈 p.pushq.push是否非空temp2=q.getpop()最后一个元素进栈输出路径回复以改变的迷宫探索上下左右四个方位是否有路径是否到达出口结束到达新位置63.自行输入迷宫函数 writefile()2
8、.2概要设计1.构建一个二维数组 mazeM+2N+2用于存储迷宫矩阵自动或手动生成迷宫,即为二维数组 mazeM+2N+2赋值构建一个队列用于存储迷宫路径建立迷宫节点 struct point,用于存储迷宫中每个节点的访问情况开始结束输入长宽 m,n动态申请空间二位数组空间iusing namespace std;class T/定义描述迷宫中当前位置的结构类型public:int x;/x 代表当前位置的行坐标int y;/y 代表当前位置的列坐标int dir;/0:无效 ,1:东,2:南,3: 西,4:北;class LinkNode/链表结点friend class Stack;pu
9、blic:T data;LinkNode *next;class Stack11private:LinkNode *top;/指向第一个结点的栈顶指针public:Stack();/构造函数,置空栈Stack()/析构函数void Push(T e);/元素 data 入栈中T Pop();/栈顶元素出栈T GetPop();/取出栈顶元素void Clear();/把栈清空bool empty();/判断栈是否为空,如果为空则返回 1,否则返回 0;Stack:Stack()/构造函数,置空栈top=NULL;void Stack:Push(T e)/元素 x 入栈中LinkNode *P;
10、P=new LinkNode;P-data=e;12P-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;13bool Stack:empty()/判断栈是否为空,如果为空则返回 1,否则返回 0if(top=NULL) return 1;else return 0;int move42=0,1
11、,1,0,0,-1,-1,0;/定义当前位置移动的 4 个方向void PrintPath(Stack p)/输出路径coutdata=p.Pop();/取栈 p 的顶点元素,即第一个位置t.Push(temp-data);/第一个位置入栈 tdelete temp;/释放空间while(!p.empty()/如果栈 p 非空,则反复转移14temp=new LinkNode;temp-data=p.Pop();/获取下一个位置/得到行走方向a=t.GetPop().x-temp-data.x;/行坐标方向b=t.GetPop().y-temp-data.y;/列坐标方向if(a=1) tem
12、p-data.dir=1;/方向向下,用 1 表示else if(b=1) temp-data.dir=2;/方向向右,用 2 表示else if(a=-1) temp-data.dir=3;/方向向上,用 3 表示else if(b=-1) temp-data.dir=4;/方向向左,用 4 表示t.Push(temp-data);/把新位置入栈delete temp;/输出路径,包括行坐标,列坐标,下一个位置方向while(!t.empty()/栈非空,继续输出data=t.Pop();coutab;/输入迷宫的长和宽coutmazeij;for(i=0;im+2;i+)mazei0=ma
13、zein+1=1;for(i=0;in+2;i+)maze0i=mazem+1i=1;return maze;/返回存贮迷宫的二维指针 maze;bool Mazepath(int *maze,int m,int n)/寻找迷宫 maze 中从(0 ,0)到(m,n)的路径Stack q,p;/定义栈 p、q,分别存探索迷宫的过程和存储路径T Temp1,Temp2; int x,y,loop;17Temp1.x=1;Temp1.y=1;q.Push(Temp1);/将入口位置入栈p.Push(Temp1);maze11=-1;/标志入口位置已到达过while(!q.empty()/栈 q 非
14、空,则反复探索Temp2=q.GetPop();/获取栈顶元素if(!(p.GetPop().x)=(q.GetPop().x) /如果有新位置入栈,则把上一个探索的位置存入栈 pfor(loop=0;loop4;loop+)/探索当前位置的 4 个相邻位置x=Temp2.x+moveloop0;/计算出新位置 x 位置值y=Temp2.y+moveloop1;/计算出新位置 y 位置值if(mazexy=0)/判断新位置是否可达Temp1.x=x;Temp1.y=y;mazexy=-1;/标志新位置已到达过q.Push(Temp1);/新位置入栈if(x=(m)Temp1.y=n;Temp1
15、.dir=0;p.Push(Temp1);/把最后一个位置入栈PrintPath(p);/输出路径Restore(maze,m,n);/恢复路径return 1;/表示成功找到路径if(p.GetPop().x=q.GetPop().xq.Pop();return 0;/表示查找失败,即迷宫无路经int main()int m=0,n=0;/定义迷宫的长和宽19int *maze;/定义二维指针存取迷宫maze=GetMaze(m,n);/调用 GetMaze(int else cout“路径不存在!n“;return 0;20参考文献1 严蔚敏吴伟民数据结构(C 语言版)清华大学出版社,20002 文益民周学毛李健数据结构与程序设计人民邮电出版社 20083 谭浩强 C 程序设计(第三版)清华大学出版设 20084 林锐韩永泉高质量程序设计指南C+/C 语言第 3 版 2007