1、【完成题目 3】迷宫求解【问题描述】以一个 m*n 的长方阵表示迷宫,0 和 1 分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。【基本要求】首先实现一个栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中(i,j)指示迷宫中的一个坐标,d 表示走到下一坐标的方向。【算法设计】本实验的目的是设计一个程序,实现手动或者自动生成一个 nm 矩阵的迷宫,寻找一条从入口点到出口点的通路。我们将其简化成具体实验内容如下:选择手动或者自动生成一个 nm 的迷宫,将迷宫的左上角作入口,右下角作出口,设“0”为
2、通路, “1”为障碍,即无法穿越。假设从起点出发,目的为右下角终点,可向“上、下、左、右、左上、左下、右上、右下”8 个方向行走。如果迷宫可以走通,则用“”代表“1” ,用“”代表“0” ,用“”代表行走迷宫的路径。输出迷宫原型图、迷宫路线图以及迷宫行走路径。如果迷宫为死迷宫,输出信息。可以二维数组存储迷宫数据,用户指定入口下标和出口下标。为处理方便起见,可在迷宫的四周加一圈障碍。对于迷宫中任一位置,均可约定有东、南、西、北四个方向可通。本程序包含三个模块1)主程序模块:void main() 初始化;do 接受命令;处理命令; while (命令! = 退出);2)栈模块实现栈抽象数据类型;
3、3)迷宫模块实现迷宫抽象数据类型。【源代码】#include /库中包含 system(“pause“)和 rand()函数#include /c 语言里的库#include#include #define OK 1#define ERROR 0#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define OVERFLOW -1#define M 49#define N 49using namespace std;int mazeMN; typedef int Status;typedef structint m,n,direc;Maz
4、eType,*LMazeType;typedef structLMazeType top;LMazeType base;int stacksize;int over;Stack; void Init_hand_Maze(int mazeMN,int m,int n)int i,j;for(i=1;imazeij;for(i=1;i=S.stacksize)S.base=(LMazeType)realloc(S.base,(S.stacksize+STACKINCREMENT) * sizeof(MazeType);if(!S.base)exit(OVERFLOW);S.top=S.base+S
5、.stacksize;S.stacksize+=STACKINCREMENT;*S.top+=e;return OK;Status Pop(Stack e=*-S.top;return OK;Status MazePath(Stack mazee.me.n=2;if(e.m=m/表示存满一条路径 return OK; else e.n+;e.direc=0;/来这一点时的方向,0 右 1 下 2 左 3 上MazePath(S,e,maze,m,n); elseif(S.top!=S.basee.m+;e.direc=1; break;case 1:e.m-;e.n-;e.direc=2; b
6、reak;case 2:e.n+;e.m-;e.direc=3;break;case 3:Pop(S,e);break;while(S.top!=S.basereturn OK; int PrintPath(Stack S,int mazeMN,int row,int col)if(S.top=S.base)couti;switch(i)case 1:coutm;coutn;while(m49)|(n49)coutm;coutn;Init_hand_Maze(maze,m,n);PrintMaze(maze,m,n);MazeType start,end;coutstart.mstart.n;
7、start.direc=0;coutend.mend.n;Stack S;coutm;coutn;while(m49)|(n49)coutm;coutn;Init_automatic_Maze(maze,m,n);PrintMaze(maze,m,n);coutstart.mstart.n;start.direc=0;coutend.mend.n;cout“寻找路径.“endl;InitStack(S);MazePath(S,start,maze,end.m,end.n);PrintPath(S,maze,m,n);system(“pause“);cout“nnPress Enter Cont
8、iue!n“;getchar();while(getchar()!=n); break;case 3:cycle=(-1);break;default:cout“n“;cout“你的输入有误!n“;cout“nPress Enter Contiue!n“;getchar();while(getchar()!=n);break;【结果截图】迷宫无解的情况手动生成迷宫的情况自动生成迷宫的情况【收获及体会】1. 本次实验核心算法明晰,思路明确,易于实现。遇到的问题是,迷宫的外围若未设置障碍,用此程序采用的求解迷宫路径的算法无法获得正确结果。2. 本程序的 MazePath 算法代码不够简洁,但不影响算法实现。3. 本次实验由于时间问题和知识水平有限,还存在一些问题,比如:界面比较单调,整个程序的功能还不完善,还有界面做的有些简单,菜单没有做好,可进行的操作太少,这些都有待进一步改善。4本次实验使我对迷宫游戏的原理有了一定的了解,但做出的结果离真正的迷宫还有很大差距,还需要进一步完善,需要自己课下学习更多的知识。