以下迷宫问题中有用到 栈的基本操作 请查看本博客其他文章————【栈的基本操作的实现】
//maze.cpp
#include "stack.cpp"
#define MAXLEN 10 //迷宫包括外墙最大行列数目
typedef struct{
int r;
int c;
char adr[MAXLEN][MAXLEN]; //可取' ', '*' , '@' , '#'
}MazeType; //迷宫类型
Status InitMaze(MazeType &maze){ //初始化迷宫,若成功返回TRUE,否则返回FALSE
int m,n,i,j;
printf("Enter row and column numbers: ");
scanf("%d%d",&maze.r,&maze.c); //迷宫行和列数
for(i=0;i<=maze.c+1;i++){ //迷宫行外墙
maze.adr[0][i]='#';
maze.adr[maze.r+1][i]='#';
}//for
for(i=0;i<=maze.r+1;i++){ //迷宫列外墙
maze.adr[i][0]='#';
maze.adr[i][maze.c+1]='#';
}
for(i=1;i<=maze.r;i++)
for(j=1;j<=maze.c;j++)
maze.adr[i][j]=' '; //初始化迷宫
printf("Enter block's coordinate((-1,-1) to end): ");
scanf("%d%d",&m,&n); //接收障碍的坐标
while(m!=-1){
if(m>maze.r || n>maze.c) //越界
exit(ERROR);
maze.adr[m][n]='#'; //迷宫障碍用'#'标记
printf("Enter block's coordinate((-1,-1) to end): ");
scanf("%d%d",&m,&n);
}//while
return OK;
}//InitMaze
Status Pass(MazeType maze,PostType curpos){ //当前位置可通则返回TURE,否则返回FALSE
if(maze.adr[curpos.r][curpos.c]==' ') //可通
return TRUE;
else
return FALSE;
}//Pass
Status FootPrint(MazeType &maze,PostType curpos){ //若走过并且可通返回TRUE,否则返回FALSE //在返回之前销毁栈S
maze.adr[curpos.r][curpos.c]='*'; //"*"表示可通
return OK;
}//FootPrint
PostType NextPos(PostType &curpos,int i){ //指示并返回下一位置的坐标
PostType cpos;
cpos=curpos;
switch(i){ //1,2,3,4分别表示东,南,西,北方向
case 1 : cpos.c+=1; break;
case 2 : cpos.r+=1; break;
case 3 : cpos.c-=1; break;
case 4 : cpos.r-=1; break;
default: exit(ERROR);
}
return cpos;
}//Nextpos
Status MarkPrint(MazeType &maze,PostType curpos){ //曾走过但不是通路标记并返回OK
maze.adr[curpos.r][curpos.c]='@'; //"@"表示曾走过但不通
return OK;
}//MarkPrint
Status MazePath(MazeType &maze,PostType start,PostType end){ //若迷宫maze存在从入口start到end的通道,则求得一条存放在栈中,并返回TRUE,否则返回FALSE
Stack S;
PostType curpos;
int curstep; //当前序号,1,2,3,4分别表示东,南,西,北方向
SElemType e;
InitStack(S);
curpos=start; //设置"当前位置"为"入口位置"
curstep=1; //探索第一步
do{
if(Pass(maze,curpos)){ //当前位置可以通过,即是未曾走到过的通道
FootPrint(maze,curpos); //留下足迹
e.ord=curstep;
e.seat=curpos;
e.di=1;
Push(S,e); //加入路径
if(curpos.r==end.r&& curpos.c==end.c)
if(!DestroyStack(S)) //销毁失败
exit(OVERFLOW);
else
return TRUE; //到达出口
else{
curpos=NextPos(curpos,1); //下一位置是当前位置的东邻
curstep++; //探索下一步
}//else
}//if
else{ //当前位置不通
if(!StackEmpty(S)){
Pop(S,e);
while(e.di==4 && !StackEmpty(S)){
MarkPrint(maze,e.seat);
Pop(S,e); //留下不能通过的标记,并退一步
}//while
if(e.di < 4){
e.di++; //换下一个方向探索
Push(S,e);
curpos=NextPos(e.seat,e.di); //设定当前位置是该新方向上的相邻
}//if
}//if
}//else
}while(!StackEmpty(S));
if(!DestroyStack(S)) //销毁失败
exit(OVERFLOW);
else
return FALSE;
}//MazePath
void PrintMaze(MazeType &maze){ //将标记路径信息的迷宫输出到终端(包括外墙)
int i,j;
printf("/nShow maze path(*---pathway):/n/n");
printf(" ");
for(i=0;i<=maze.r+1;i++) //打印列数名
printf("%4d",i);
printf("/n/n");
for(i=0;i<=maze.r+1;i++){
printf("%2d",i); //打印行名
for(j=0;j<=maze.c+1;j++)
printf("%4c",maze.adr[i][j]); //输出迷宫//当前位置的标记
printf("/n/n");
}
}//PrintMaze
void main(){ //主函数
MazeType maze;
PostType start,end;
char cmd;
do{
printf("-------FOUND A MAZEPATH--------/n");
if(!InitMaze(maze)){ //初始化并创建迷宫
printf("/nInitialization errors!!!/n");
exit(OVERFLOW); //初始化错误
}
do{ //输入迷宫入口坐标
printf("/nEnter entrance coordinate of the maze: ");
scanf("%d%d",&start.r,&start.c);
if(start.r>maze.r || start.c>maze.c){
printf("/nBeyond the maze!!!/n");
continue;
}
}while(start.r>maze.r || start.c>maze.c);
do{ //输入迷宫出口坐标
printf("/nEnter exit coordinate of the maze: ");
scanf("%d%d",&end.r,&end.c);
if(end.r>maze.r || end.c>maze.c){
printf("/nBeyond the maze!!!/n");
continue;
}
}while(end.r>maze.r || end.c>maze.c);
if(!MazePath(maze,start,end)) //迷宫求解
printf("/nNo path from entrance to exit!/n");
else
PrintMaze(maze); //打印路径
printf("/nContinue?(y/n): ");
scanf("%s",&cmd);
}while(cmd=='y' || cmd=='Y');
}//main