数据结构迷宫问题实验报告

合集下载

数据结构之迷宫找到路径实验报告

数据结构之迷宫找到路径实验报告

实验报告课程名:数据结构(C语言版)实验名:迷宫问题I姓名:班级:学号:撰写时间:2014/10/05一实验目的与要求1. 了解栈的应用2. 利用栈在迷宫中找到一条路二实验内容•一个迷宫如图1所示, 是由若干个方格构成的一个矩形, 其中有唯一的一个入口(用标示), 有唯一的一个出口(用△标示). 图中深色的方格无法到达, 浅色的方格都是可以到达的. 每一次只能从当前方格前进到与当前方格有公共边的方格中(因此前进方向最多有四个).•本次实验的迷宫问题要求求解一条从入口到出口的路.图1:迷宫三实验结果与分析程序:#include <stdio.h>#include <stdlib.h>/* run this program using the console pauser or add your own getch, system("pause") or input loop */int Maze(int ox,int oy,int ex,int ey,int rnum,int cnum,int a[rnum][cnum]){int b[rnum][cnum];int i,j,Znum=0;for(i=0;i<rnum;++i){for(j=0;j<cnum;++j){b[i][j]=a[i][j];if(a[i][j]==0){Znum=Znum+1;}}}int Sx[Znum+1], Sy[Znum+1], p=0;for(i=0;i<Znum+1;++i){Sx[i]=-1;Sy[i]=-1;}int dx[4] = {0,1,0,-1};int dy[4] = {-1,0,1,0};Sx[p]=ox;Sy[p]=oy;b[ox][oy]=2;p=1;int brand = -1;//------------------------------------- while(p>0){if(Sx[p-1]==ex && Sy[p-1]==ey){brand = 1;break;}else{int tb = -1;for(i=1;i<4;++i){int tx = Sx[p-1]+dx[i];int ty = Sy[p-1]+dy[i];if(b[tx][ty]==0){tb = 1;Sx[p]=tx;Sy[p]=ty;b[tx][ty]=2;p=p+1;}}if(tb<0){b[Sx[p-1]][Sy[p-1]]=-1;p=p-1;}}}if(brand>0){while(p>0){printf("(%d,%d), ",Sx[p-1],Sy[p-1]);p=p-1;}}return(brand);}int main(int argc, char *argv[]) {int rnum = 10; //rnum和cnum分别对应行和列int cnum = 10;int a[10][10]={{1,1,1,1,1,1,1,1,1,1},{1,0,0,1,0,0,0,1,0,1},{1,0,0,1,0,0,0,1,0,1},{1,0,0,0,0,1,1,0,0,1},{1,0,1,1,1,0,0,0,0,1},{1,0,0,0,1,0,0,0,0,1},{1,0,1,0,0,0,1,0,0,1},{1,0,1,1,1,0,1,1,0,1},{1,1,0,0,0,0,0,0,0,1},{1,1,1,1,1,1,1,1,1,1}};//假设迷宫外围有一层不可到达的方块,则方块变成了10X10 int ox=1,oy=1,ex=rnum-2,ey=cnum-2;int brand = Maze(ox,oy,ex,ey,rnum,cnum,a);if(brand<0){printf("There is no way\n");}return 0;}图1:实验结果截图。

数据结构-迷宫实验报告

数据结构-迷宫实验报告

v1.0 可编辑可修改云南大学软件学院数据结构实验报告(本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)实验难度: A □ B □ C □实验难度 A □ B □ C □承担任务(难度为C时填写)指导教师评分(签名)【实验题目】实验4.数组的表示极其应用【问题描述】以一个m×n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。

设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。

【基本要求】首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。

求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d 表示走到下一坐标的方向。

如;对于下列数据的迷宫,输出的一条通路为:(l,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),…。

•(下面的内容由学生填写,格式统一为,字体: 楷体, 行距: 固定行距18,字号: 小四,个人报告按下面每一项的百分比打分。

难度A满分70分,难度B满分90分)一、【实验构思(Conceive)】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计、算法等相关知识)本实验的目的是设计一个程序,实现手动或者自动生成一个n×m矩阵的迷宫,寻找一条从入口点到出口点的通路。

我们将其简化成具体实验内容如下:选择手动或者自动生成一个n×m的迷宫,将迷宫的左上角作入口,右下角作出口,设“0”为通路,“1”为墙,即无法穿越。

假设从起点出发,目的为右下角终点,可向“上、下、左、右、左上、左下、右上、右下”8个方向行走。

如果迷宫可以走通,则用“■”代表“1”,用“□”代表“0”,用“→”代表行走迷宫的路径。

输出迷宫原型图、迷宫路线图以及迷宫行走路径。

如果迷宫为死迷宫,输出信息。

可以二维数组存储迷宫数据,用户指定入口下标和出口下标。

迷宫问题实验报告

迷宫问题实验报告

迷宫问题实验报告武汉纺织大学数学与计算机学院数据结构课程设计报告迷宫问题求解学生姓名:学号:班级:指导老师:报告日期:一、问题描述以一个m x n的长方矩阵表示迷宫,1和0分别表示迷宫中的通路和障碍。

设计一个程序,对任意设定的迷宫,求出从入口到出口的通路,或者没有通路的结论。

二、需求分析1、以二维数组maze[10][10]表示迷宫,数组中以元素1表示通路,0表示障碍,迷宫的大小理论上可以不限制,但现在只提供10*10大小迷宫。

2、迷宫的入口和出口需由用户自行设置。

3、以长方形矩阵的形式将迷宫及其通路输出,输出中“#”表示迷宫通路,“1”表示障碍。

4、本程序只求出一条成功的通路。

但是只要对函数进行小量的修改,就可以求出其他全部的路径。

5、程序执行命令为:(1)输入迷宫;(2)、求解迷宫;(3)、输出迷宫。

三、概要设计1、设定栈的抽象数据类型定义:ADT zhan{基本操作:InitStack(SqStack &S)操作结果:构造一个空栈push(*s,*e)初始条件:栈已经存在操作结果:将e所指向的数据加入到栈s中pop(*s,*e)初始条件:栈已经存在操作结果:若栈不为空,用e返回栈顶元素,并删除栈顶元素getpop(*s,*e)初始条件:栈已经存在操作结果:若栈不为空,用e返回栈顶元素stackempty(*s)初始条件:栈已经存在操作结果:判断栈是否为空。

若栈为空,返回1,否则返回0 }ADT zhan2、设定迷宫的抽象数据类型定义ADT migong{基本操作:Status print(MazeType maze); //显示迷宫Status Pass(MazeType maze,PosType curpos); //判断当前位置是否可通Status FootPrint(MazeType &maze,PosType curpos);//标记当前位置已经走过Status MarkPrint(MazeType &maze,PosType curpos); //标记当前位置不可通PosType NextPos(PosType curpos,DirectiveTypedi);// 进入下一位置}ADT yanshu3、本程序包括三个模块a、主程序模块void main(){初始化;迷宫求解;迷宫输出;}b、栈模块——实现栈的抽象数据类型c、迷宫模块——实现迷宫的抽象数据类型四、流程图五、数据结构t ypedef struct //位置结构{int row; //行位置int col; //列位置}PosType;typedef struct //迷宫类型{int arr[10][10];}MazeType;typedef struct{int step; //当前位置在路径上的"序号"PosType seat; //当前的坐标位置DirectiveType di; //往下一个坐标位置的方向 }SElemType;typedef struct //栈类型{SElemType *base; //栈的尾指针 SElemType *top; //栈的头指针int stacksize; //栈的大小 }SqStack;六、调试结果和分析a)测试结果实际程序执行过程如下图所示:参考文献[1] 严蔚敏、吴伟民:《数据结构(C语言版)》[M],清华大学出版社 2007年版[2] 谭浩强:《C语言设计(第三版)》[M],清华大学出版社2005年版心得体会通过这段时间的课程设计,本人对计算机的应用,数据结构的作用以及C 语言的使用都有了更深的了解。

数据结构之迷宫求解实验报告武汉大学

数据结构之迷宫求解实验报告武汉大学

数据结构实验报告——迷宫求解问题实验上机环境: DevC++二、程序设计相关信息(1)实验题目:迷宫求解问题问题描述:实验题 改进节中的求解迷宫问题程序,要求输出如图所示的迷宫的所有路径,并求最短路径长度及最短路径。

(2)实验项目组成:本项目由一个原程序及文件组成。

(3)实验项目的程序结构: 函数调用关系图:0 1 2 3 4 5 01234 出入main() main()struct 结构体 mgpath()路径函数(4)实验项目包含的函数的功能描述: mg[M+1][N+1] =1;Stack[top].j=1;Stack[top].di=-1;mg[1][1]=-1;printf("迷宫所有路径如下:\n");while(top>-1){i=Stack[top].i;j=Stack[top].j;di=Stack[top].di; if(i==M-2&&j==N-2){printf("%4d:",count++);for(k=0;k<=top;k++){printf("(%d,%d)",Stack[k].i,Stack[k].j); if((k+1)%5==0) mg=0回mg=1进循环for下一下一个方块前一个方块值下一个方块值输出方位坐标入口结束printf("\n ");}printf("\n");if(top+1<min){for(k=0;k<=top;k++)Path[k]=Stack[k];min=top+1;}mg[Stack[top].i][Stack[top].j]=0;top--;i=Stack[top].i;j=Stack[top].j;di=Stack[top].di; }find=0;while(di<4&&find==0){di++;switch(di){case 0:i=Stack[top].i-1;j=Stack[top].j;break; case 1:i=Stack[top].i;j=Stack[top].j+1;break; case 2:i=Stack[top].i+1;j=Stack[top].j;break; case 3:i=Stack[top].i;j=Stack[top].j-1;break; }if(mg[i][j]==0)find=1;}if(find==1){Stack[top].di=di;top++;Stack[top].i=i;Stack[top].j=j;Stack[top].di=-1;mg[i][j]=-1;}else{mg[Stack[top].i][Stack[top].j]=0; top--;}}printf("\n");printf("最短路径如下:\n");printf("路径最短长度:%d\n",min);printf("最短路径路径:\n");for(k=0;k<min;k++){printf("(%d,%d)",Path[k].i,Path[k].j); }printf("\n\n");}int main(){mgpath();system("PAUSE"); return 0;}。

数据结构实验-迷宫问题

数据结构实验-迷宫问题

实验报告入口(没有通路)。

在探索前进路径时,需要将搜索的踪迹记录下来,以便走不通时,可沿原路返回到前一个点换一个方向再进行新的探索。

后退的尝试路径与前进路径正好相反,因此可以借用一个栈来记录前进路径。

方向:每一个可通点有4个可尝试的方向,向不同的方向前进时,目的地的坐标不同。

预先把4个方向上的位移存在一个数组中。

如把上、右、下、左(即顺时针方向)依次编号为0、1、2、3.其增量数组move[4]如图3所示。

move[4] x y0 -1 01 0 12 1 03 0 -1图2数组move[4]方位示意图如下:从前一个方块找到相邻可走方块之后,再从当前方块找在、相邻可走方块,若没有这样的方快,说明当前方块不可能是从入口路径到出口路径的一个方块,则从当前方块回溯到前一个方块,继续从前一个方块找可走的方块。

为了保证试探的可走的相邻方块不是已走路径上的方块,如(i,j)已经进栈,在试探(i+1,j)的下一方块时,又试探道(i,j),这样会很悲剧的引起死循环,为此,在一个方块进栈后,将对应的mg数组元素的值改为-1(变为不可走的相邻方块),当退栈时(表示该方块没有相邻的可走方块),将其值恢复0,其算法代码和相应的解释如下:find=0;while (di<4 && find==0) //找下一个可走方块{di++;switch(di){case 0:i=st[top].i-1;j=st[top].j;break;case 1:i=st[top].i;j=st[top].j+1;break;case 2:i=st[top].i+1;j=st[top].j;break;case 3:i=st[top].i,j=st[top].j-1;break;}if (mg[i][j]==0) find=1;//找到下一个可走相邻方块}if (find==1) //找到了下一个可走方块{st[top].di=di; //修改原栈顶元素的di值top++; //下一个可走方块进栈st[top].i=i;st[top].j=j;st[top].di=-1;mg[i][j]=-1; //避免重复走到该方块}else //没有路径可走,则退栈{mg[st[top].i][st[top].j]=0;//让该位置变为其他路径可走方块top--; //将该方块退栈}}return(0); //表示没有可走路径,返回0(2)求解主程序建立主函数调用上面的算法,将mg和st栈指针定义为全局变量void main(){mgpath(1,1,M,N);四、界面设计设计很简单的界面,输出路径。

《数据结构》上机实验报告—利用栈实现迷宫求解

《数据结构》上机实验报告—利用栈实现迷宫求解
typedef struct{
SElemType* base;//栈基址,构造前销毁后为空
SElemType* top;//栈顶
int stackSize; //栈容量
}Stack; //栈类型
Status InitStack(Stack &S){ //构造空栈s
S.base=(SElemType*)malloc(INIT_SIZE *sizeof(SElemType));
Stack S;
PostType curpos;
int curstep;//当前序号
SElemType e;
InitStack(S);
InitStack(Path);
curpos=start; //设置"当前位置"为"入口位置"
curstep=1; //探索第一步
do{
if(Pass(maze,curpos)){//当前位置可以通过,即是未曾走到过的通道
福州大学数计学院
《数据结构》上机实验报告
专业和班级:信息计算科学与应用数学6班
学号
姓名
成绩
实验名称
栈、队列
实验内容
利用栈实现迷宫求解







【实验目的】
应用栈结构来解决应用问题,加深对栈结构特点的认识和应用。
【基本要求】
首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。如:对于下列数据的迷宫,输出的一条通路为;(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),....

迷宫问题实验报告

迷宫问题实验报告

迷宫问题实验报告篇一:迷宫问题实验报告武汉纺织大学数学与计算机学院数据结构课程设计报告迷宫问题求解学生姓名:学号:班级:指导老师:报告日期:一、问题描述以一个m x n的长方矩阵表示迷宫,1和0分别表示迷宫中的通路和障碍。

设计一个程序,对任意设定的迷宫,求出从入口到出口的通路,或者没有通路的结论。

二、需求分析1、以二维数组maze[10][10]表示迷宫,数组中以元素1表示通路,0表示障碍,迷宫的大小理论上可以不限制,但现在只提供10*10大小迷宫。

2、迷宫的入口和出口需由用户自行设置。

3、以长方形矩阵的形式将迷宫及其通路输出,输出中“#”表示迷宫通路,“1”表示障碍。

4、本程序只求出一条成功的通路。

但是只要对函数进行小量的修改,就可以求出其他全部的路径。

5、程序执行命令为:(1)输入迷宫;(2)、求解迷宫;(3)、输出迷宫。

三、概要设计1、设定栈的抽象数据类型定义:ADT zhan{ 基本操作:InitStack操作结果:构造一个空栈push(*s,*e)初始条件:栈已经存在操作结果:将e所指向的数据加入到栈s中pop(*s,*e)初始条件:栈已经存在操作结果:若栈不为空,用e返回栈顶元素,并删除栈顶元素getpop(*s,*e)初始条件:栈已经存在操作结果:若栈不为空,用e返回栈顶元素stackempty初始条件:栈已经存在操作结果:判断栈是否为空。

若栈为空,返回1,否则返回0 }ADT zhan 2、设定迷宫的抽象数据类型定义ADT migong{基本操作:Status print;//显示迷宫Status Pass; //判断当前位置是否可通Status FootPrint;//标记当前位置已经走过Status MarkPrint; //标记当前位置不可通PosType NextPos; // 进入下一位置}ADT yanshu3、本程序包括三个模块a、主程序模块void main {初始化;迷宫求解;迷宫输出;}b、栈模块——实现栈的抽象数据类型c、迷宫模块——实现迷宫的抽象数据类型四、流程图五、数据结构typedef struct //位置结构{ int row; //行位置int col; //列位置}PosType;typedef struct//迷宫类型{ int arr[10][10]; }MazeType;typedef struct {int step; //当前位置在路径上的”序号”PosType seat; //当前的坐标位置DirectiveType di; //往下一个坐标位置的方向}SElemType;typedef struct // 栈类型{SElemType *base; //栈的尾指针SElemType *top;//栈的头指针int stacksize;//栈的大小}SqStack;六、调试结果和分析a) 测试结果实际程序执行过程如下图所示:篇二:迷宫求解实验报告数据结构(迷宫求解实验报告)一、实验构思(Conceive)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计、算法等相关知识)实验实现基本思路:若当前位置可通,则纳入当前路径,并继续朝下一个位置探索,即切换下一位置为当前位置,如此重复直至到达出口;若当前位置不可通,则应顺着来向退回到前一通道块,然后朝着除来向之外的其他方向继续探索;若该通道块的四周4个方块均不可通,则应从当前路径上删除该通道块。

数据结构之迷宫求解实验报告武汉大学

数据结构之迷宫求解实验报告武汉大学

数据结构实验报告——迷宫求解问题实验上机环境: DevC++二、程序设计相关信息(1)实验题目:迷宫求解问题问题描述:实验题3.5 改进3.1.4节中的求解迷宫问题程序,要求输出如图3.14所示的迷宫的所有路径,并求最短路径长度及最短路径。

(2)实验项目组成:本项目由一个原程序mg.cpp 及mg.exe 文件组成。

(3)实验项目的程序结构:(4)实验项目包含的函数的功能描述:mg[M+1][N+1] //构造迷宫二维数组,1表示墙不可走方块,0表示通道mgpath(int xi,int yi,int xe,int ye)//求解路径为:(xi,yi )->(xe,ye )//采用顺序栈存储,进栈,回溯,退栈等(5)算法描述:求解迷宫从入口到出口的所有路径,从入口出发,顺某一个方向向前试探,对于可走的方块都进栈,并将这个可走发方位保存,且top+1,然后试探下一个方块,若下一个方块能走通则继续,0 1 2 3 4 512345 出口入口 main() main() struct 结构体 mgpath()路径函数否则则回溯到前一个方块,且top-1。

为记录所有的路径调用Path[k]=Stack[k]记录,从次方块向不同方向去试探,已经走过的方块则为不可走方块。

最后比较top 值找到一条最短路径并输出。

试探路径过程的算法利用了“广度优先搜索遍历”算法。

流程图:(6)实验数据:迷宫数组如下:int mg[M+1][N+1]={{1,1,1,1,1,1},{1,0,0,0,1,1},{1,0,1,0,0,1},{1,0,0,0,1,1},{1,1,0,0,0,1},{1,1,1,1,1,1}};实验结果:mg=0回溯mg=1进栈 循环for下一个方块变成前一个方块下一个方块值 mg[i][j] 前一个方块值mg[][]=0下一个方块值mg[][]=0输出方位坐标( , )入口 结束三、程序代码:#include <stdio.h>#include <stdlib.h>#define M 6#define N 6#define Maxsize 100int mg[M+1][N+1]={{1,1,1,1,1,1},{1,0,0,0,1,1},{1,0,1,0,0,1},{1,0,0,0,1,1},{1,1,0,0,0,1},{1,1,1,1,1,1}};struct{int i;int j;int di;}Stack[Maxsize],Path[Maxsize];int top=-1;int count=1;int min=Maxsize;int mgpath(){int i,j,di,find,k;top++;Stack[top].i=1;Stack[top].j=1;Stack[top].di=-1;mg[1][1]=-1;printf("迷宫所有路径如下:\n");while(top>-1){i=Stack[top].i;j=Stack[top].j;di=Stack[top].di;if(i==M-2&&j==N-2){printf("%4d:",count++);for(k=0;k<=top;k++){printf("(%d,%d)",Stack[k].i,Stack[k].j);if((k+1)%5==0)printf("\n ");}printf("\n");if(top+1<min){for(k=0;k<=top;k++)Path[k]=Stack[k];min=top+1;}mg[Stack[top].i][Stack[top].j]=0;top--;i=Stack[top].i;j=Stack[top].j;di=Stack[top].di; }find=0;while(di<4&&find==0){di++;switch(di){case 0:i=Stack[top].i-1;j=Stack[top].j;break;case 1:i=Stack[top].i;j=Stack[top].j+1;break;case 2:i=Stack[top].i+1;j=Stack[top].j;break;case 3:i=Stack[top].i;j=Stack[top].j-1;break;}if(mg[i][j]==0)find=1;}if(find==1){Stack[top].di=di;top++;Stack[top].i=i;Stack[top].j=j;Stack[top].di=-1;mg[i][j]=-1;}else{mg[Stack[top].i][Stack[top].j]=0;top--;}}printf("\n");printf("最短路径如下:\n");printf("路径最短长度:%d\n",min);printf("最短路径路径:\n");for(k=0;k<min;k++){printf("(%d,%d)",Path[k].i,Path[k].j);}printf("\n\n");} int main(){mgpath();system("PAUSE"); return 0;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

. . . . .资料. . 《数据结构与算法设计》 迷宫问题实验报告 ——实验二

专业:物联网工程 班级:物联网1班 学号:15180118 :刘沛航 . . .

. .资料. . 一、 实验目的 本程序是利用非递归的方法求出一条走出迷宫的路径,并将路径输出。首先由用户输入一组二维数组来组成迷宫,确认后程序自动运行,当迷宫有完整路径可以通过时,以0和1所组成的迷宫形式输出,标记所走过的路径结束程序;当迷宫无路径时,提示输入错误结束程序。 二、实验内容 用一个m*m长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序对于任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 三、程序设计 1、概要设计 (1) 设定栈的抽象数据类型定义 ADT Stack{ 数据对象:D={ai|ai属于CharSet,i=1、2…n,n>=0} 数据关系:R={|ai-1,ai属于D,i=2,3,…n} 基本操作: InitStack(&S) 操作结果:构造一个空栈 Push(&S,e) 初始条件:栈已经存在 操作结果:将e所指向的数据加入到栈s中 Pop(&S,&e) 初始条件:栈已经存在 操作结果:若栈不为空,用e返回栈顶元素,并删除栈顶元素 Getpop(&S,&e) 初始条件:栈已经存在 操作结果:若栈不为空,用e返回栈顶元 . . . . .资料. . StackEmpty(&S) 初始条件:栈已经存在 操作结果:判断栈是否为空。若栈为空,返回1,否则返回0 Destroy(&S) 初始条件:栈已经存在 操作结果:销毁栈s }ADT Stack

(2)设定迷宫的抽象数据类型定义 ADT yanshu{ 数据对象:D={ai,j|ai,j属于{‘ ’、‘*’、‘’、‘#’},0<=i<=M,0<=j<=N} 数据关系:R={ROW,COL}

ROW={|ai-1,j,ai,j属于D,i=1,2,…M,j=0,1,…N}

COL={|ai,j-1,ai,j属于D,i=0,1,…M,j=1,2,…N} 基本操作: InitMaze(MazeType &maze, int a[][COL], int row, int col){ 初始条件:二维数组int a[][COL],已经存在,其中第1至第m-1行,每行自第1到第n-1列的元素已经值,并以值0表示障碍,值1表示通路。

操作结果:构造迷宫的整形数组,以空白表示通路,字符‘0’表示障碍 在迷宫四周加上一圈障碍 MazePath(&maze){ 初始条件:迷宫maze已被赋值 操作结果:若迷宫maze中存在一条通路,则按如下规定改变maze的状态;以字符‘*’表示路径上的位置。字符‘’表示‘死胡同’;否则迷宫的状态不变

} PrintMaze(M){ 初始条件:迷宫M已存在 操作结果:以字符形式输出迷宫 } }ADTmaze

(3)本程序包括三个模块 . . . . .资料. . a、 主程序模块 void main() { 初始化; 构造迷宫; 迷宫求解; 迷宫输出; } b、 栈模块——实现栈的抽象数据类型 c、 迷宫模块——实现迷宫的抽象数据类型 2、详细设计

(1)坐标位置类型:

typedef struct{ int row; //迷宫中的行 int col; //......的列

}PosType;//坐标

(2) 迷宫类型:

typedef struct{ int m,n; int arr[RANGE][RANGE]; }MazeType; //迷宫类型 void InitMaze(MazeType &maze, int a[][COL], int row, int col)\ //设置迷宫的初值,包括边缘一圈的值 Bool MazePath(MazeType &maze,PosType start, PosType end) //求解迷宫maze中,从入口start到出口end的一条路径 //若存在,则返回true,否则返回false Void PrintMaze(MazeType maze) //将迷宫打印出来

(3) 栈类型: typedef struct{ int step; //当前位置在路径上的"序号" PosType seat; //当前的坐标位置 DirectiveType di; //往下一个坐标位置的方向 }SElemType;//栈的元素类型

typedef struct{ SElemType *base; . . . . .资料. . SElemType *top; int stacksize; }SqStack; 栈的基本操作设置如下: Void InitStack(SqStack & S) //初始化,设S为空栈(S.top=NUL) Void DestroyStack(Stack &S) //销毁栈S,并释放空间 Void ClearStack(SqStack & S) //将栈S清空 Int StackLength(SqStack &S) //返回栈S的长度 Status StackEmpty(SqStack &S) ?、若S为空栈(S.top==NULL),则返回TRUE,否则返回FALSE Statue GetTop(SqStack &S,SElemType e) //r若栈S不空,则以e待会栈顶元素并返回TRUE,否则返回FALSE Statue Pop(SqStack&S,SElemType e) //若分配空间成功,则在S的栈顶插入新的栈顶元素s并返回TRUE //否则栈不变,并返回FALSE Statue Push(SqStack&S,SElemType &e) //若分配空间程控,则删除栈顶并以e带回其值,则返回TRUE //否则返回FALSE Void StackTraverse(SqStack &S,Status)(*Visit)(SElemType e)) //从栈顶依次对S中的每个节点调用函数Visit 4求迷宫路径的伪码算法: Status MazePath(MazeType &maze,PosType start, PosType end){ //求解迷宫maze中,从入口start到出口end的一条路径 InitStack(s); PosType curpos = start; int curstep = 1; //探索第一部 do{ if( Pass(maze,curpos) ){ //如果当前位置可以通过,即是未曾走到的通道块 FootPrint(maze,curpos); //留下足迹 e = CreateSElem(curstep,curpos,1); //创建元素 Push(s,e); if( PosEquare(curpos,end) ) return TRUE; curpos =NextPos(curpos,1); //获得下一节点:当前位置的东邻 curstep++; //探索下一步 }else{ //当前位置不能通过 if(!StackEmpty(s)){ Pop(s,e); while(e.di==4 && !StackEmpty(s) ){ MarkPrint(maze,e.seat); Pop(s,e); //留下不能通过的标记,并退回步 } . . . . .资料. . if(e.di<4){ e.di++; Push(s,e); //换一个方向探索 curpos = NextPos(e.seat,e.di); //设定当前位置是该方向上的相块 }//if }//if }//else }while(!StackEmpty(s)); return FALSE; } //MazePath

四、程序调试分析

1.首先呢,想自己读入数据的,回来发现那样,很麻烦,所以还是事先定义一个迷宫。 2.栈的元素类型 一开始有点迷惑,后来就解决了 3.本题中三个主要算法;InitMaze,MazePath和PrintMaze的时间复杂度均为O(m*n)本题的空间复杂度也是O(m*n) 五、用户使用说明 1.本程序运行在windows系列的操作系统下,执行文件为:Maze_Test.exe。

六、程序运行结果 . . .

. .资料. . 1.建立迷宫: 2.通过1功能建立8*8的迷宫后,通过2功能继续建立迷宫内部:

通过建立自己设定单元数目建立迷宫内墙。 3.通过3功能观察已建立的迷宫结构:

相关文档
最新文档