迷宫求解(有流程图)
一 需求分析
1 以二维数组MazeType表示迷宫,在其周围加一圈围墙;数组中'#'表示障碍,'_'表示通路。
2 程序引导用户初始化迷宫,输入其中的障碍;
3 迷宫的入口和出口可以由用户自己设定。
4 若迷宫有通路,则在其走过的路径上以'.'表示可以通过;
5本程序可以求解多条路径。既在迷宫求解过程中记下所有的走过的位置;
例如:
***********__##**_##**__##**_###**_##**_#**_#####**________***********二 系统设计
1 设定栈的抽象数据类型定义
基本操作:
int InitStack(SqStack &S)
操作结果:构造一个空栈S;
int StackEmpty(SqStack S)
初始条件:栈S已存在。
操作结果:若栈为空则返回TRUE,否则返回FALSE;
GETTOP(S,&e)
初始条件:栈S已经存在;
操作结果:若栈不为空,则以e返回栈顶元素。
int Push(SqStack &S,SElemType e)
初始条件:栈已经存在。
操作结果:在栈的顶部插入新的栈顶元素;
int Pop(SqStack &S,SElemType &e)
初始条件:栈已经存在;
操作结果:删除栈顶元素,并以E返回其值。
2 设定迷宫的抽象数据类型为:
基本操作:
1 void CreatMaze(int r,int l)
初始条件:MazeType maze已经存在,其中从第一行到最后一行,每一行的第一个元素和最后一个元素都为'*',从第一列的到最后一列,每一列的第一个和最后一个元素的值为'*';
操作结果:构成迷宫的int型数组,以'#'表示障碍,'_'表示通路。
2 mazepath(posit start,posit end)
初始条件:迷宫已经初始化;
操作结果:若迷宫中存在一条通路,则在程序运行过程中走过的路径赋值为1;并在入口处赋值为-1。若迷宫中不存在通路则打印 NO PATH。
3print()
初始条件:迷宫存在通路;
操作结果;以数字数组的形式输出迷宫。
4 footprint(posit a)
操作结果:使迷宫的M的A点的值变为足迹。
5 nextpos(posit c,int di)
操作结果:调整迷宫行进的方向,寻找出路。
3 本程序包括三个模块
1)主程序模块
int main(){
PosType start,end;
int r,l;
cout<
cin>>r>>l;
CreatMaze(r,l);
cout<
cin>>start.row>>start.line;
cout<
cin>>end.row>>end.line;
cout<
if(MazePath(start,end)){
cout<
PrintMaze(r,l);
}
else cout<
free(S.base);
return 0;
}
2)栈模块
3)迷宫模块
各模块的调用关系如下:
4)求解迷宫的通路的伪码算法:
设定当前位置的处值为入口位置;
DO
{
若当前的位置可通。
则{将当前的位置插入栈顶;
若该位置为出口位置,则结束;
否则切换当前位置的东邻的为新的当前位置;}
否则{
若栈不为空且栈的顶位置尚有其他的方向没有被探索,
则设定新的当前位置为沿顺时针方向旋转找到栈顶的位置的下一个相邻块;
若栈不空但栈顶的四周均不可通过,
则{删去栈顶位置;
若栈不为空,则重新测试新的栈顶位置;
只至找到一个可通过的块至栈空;
}
1 坐标的位置的类型
typedef struct{
int line;
int row;
}PosType;2 迷宫类型
void CreatMaze(int r,int l)//定义迷宫的墙为*,通路为_,障碍为#
{
int i,j;
for(i=0;i
maze[i][0]='*';//左面墙
maze[i][l-1]='*';//右面墙
}
for(j=1;j
maze[0][j]='*';//上面墙
maze[r-1][j]='*';//下面墙