完整数据结构 迷宫求解Word文档下载推荐.docx
《完整数据结构 迷宫求解Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《完整数据结构 迷宫求解Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
![完整数据结构 迷宫求解Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-10/10/7a6d5d32-7f71-4c91-a810-13d867b7c163/7a6d5d32-7f71-4c91-a810-13d867b7c1631.gif)
为处理方便起见,可在迷宫的四周加一圈障碍。
对于迷宫中任一位置,均可约定有东、南、西、北四个方向可通。
本程序包含三个模块
1)主程序模块:
voidmain()
{
初始化;
do{
接受命令;
处理命令;
}while(命令!
=退出);
}
2)栈模块-—实现栈抽象数据类型;
3)迷宫模块-—实现迷宫抽象数据类型。
【源代码】
#include<
stdlib。
h>
//库中包含system("
pause"
)和rand()函数
stdio.h>
//c语言里的库
#include〈iostream>
#include〈malloc.h>
#defineOK1
#defineERROR0
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
#defineOVERFLOW—1
#defineM49
#defineN49
usingnamespacestd;
intmaze[M][N];
typedefintStatus;
typedefstruct
{
intm,n,direc;
}MazeType,*LMazeType;
LMazeTypetop;
LMazeTypebase;
intstacksize;
intover;
}Stack;
voidInit_hand_Maze(intmaze[M][N],intm,intn)
inti,j;
for(i=1;
i<
=m+1;
i++)
for(j=1;
j<
=n+1;
j++)
{
maze[i][j]=1;
}
cout<
〈”请按行输入迷宫,0表示通路,1表示障碍:
”<
<
endl;
m+1;
n+1;
cin>
>
maze[i][j];
i〈m+1;
{
for(j=1;
j〈n+1;
j++)
{
if(maze[i][j]!
=0&&
maze[i][j]!
=1){
cout〈<
”您输入有误,请重新输入"
;
Init_hand_Maze(maze,m,n);
}
}
}
}
voidInit_automatic_Maze(intmaze[M][N],intm,intn)//自动生成迷宫
inti,j;
〈"
\n迷宫生成中……\n\n”;
system(”pause"
);
for(i=1;
i〈m+1;
for(j=1;
maze[i][j]=rand()%2;
//随机生成0、1
voidPrintMaze(intmaze[M][N],introw,intcol)
inti,j;
〈”迷宫如图所示。
”〈〈endl;
i〈row+1;
for(j=1;
col+1;
if(maze[i][j]==1)
〈”■"
;
else
□"
cout〈〈endl;
}
StatusInitStack(Stack&S)
S。
base=(LMazeType)malloc(STACK_INIT_SIZE*sizeof(MazeType));
if(!
S。
base)exit(OVERFLOW);
top=S.base;
stacksize=STACK_INIT_SIZE;
over=0;
returnOK;
}
StatusPush(Stack&
S,MazeTypee)
if(S。
top—S.base>
=S。
stacksize)
base=(LMazeType)realloc(S.base,(S。
stacksize+STACKINCREMENT)*sizeof(MazeType));
if(!
base)exit(OVERFLOW);
S.top=S.base+S。
stacksize;
stacksize+=STACKINCREMENT;
*S。
top++=e;
returnOK;
StatusPop(Stack&S,MazeType&e)
if(S.top==S.base)returnERROR;
e=*——S.top;
StatusMazePath(Stack&
S,MazeType&e,intmaze[M][N],intm,intn)
do
if(maze[e。
m][e.n]==0)//0可通,1不可通,2为已走过
Push(S,e);
maze[e。
m][e.n]=2;
if(e。
m==m&&
e.n==n)
S.over=1;
//表示存满一条路径
else{
e。
n++;
e.direc=0;
//来这一点时的方向,0右1下2左3上
MazePath(S,e,maze,m,n);
top!
base&&S.over!
=1)
switch(e。
direc)//回到上一位置并同时改变方向走下一步
case0:
n-—;
e.m++;
e.direc=1;
break;
case1:
e.m--;
e.n——;
direc=2;
break;
case2:
e.n++;
m—-;
direc=3;
case3:
Pop(S,e);
}while(S。
=S.base&&
over!
=1);
}
intPrintPath(StackS,intmaze[M][N],introw,intcol)
if(S.top==S.base)
cout〈<
"
\n===============================================\n”;
〈”此迷宫无解\n\n"
returnERROR;
MazeTypee;
while(S.top!
=S.base)
maze[e.m][e.n]=(e。
direc+10);
cout〈〈"
完成!
endl;
”\n===============================================\n”;
路径为:
row+1;
j〈col+1;
switch(maze[i][j])
case0:
”□"
”■”;
※”;
case10:
”→"
case11:
↓"
case12:
”←"
case13:
↑"
〈endl;
cout<
入口"
〈<
”完成!
〈endl;
intmain()
inti,m,n,maze[M][N],cycle=0;
while(cycle!
=(—1))
********************************************************************************\n”;
欢迎进入迷宫求解系统\n”;
********************************************************************************\n”;
cout〈〈”☆1手动生成迷宫☆\n”;
☆2自动生成迷宫☆\n"
”☆3退出☆\n\n"
”********************************************************************************\n”;
”\n"
cout〈〈”请选择你的操作:
\n”;
i;
switch(i)
cout〈<
\n请输入行数:
”;
cin>
〉m;
〈”\n”;
”请输入列数:
cin〉〉n;
while((m<
1||m〉49)||(n<
1||n>
49))
{
cout<
\n抱歉,你输入的行列数超出预设范围(1-49,1-49),请重新输入:
\n\n”;
cout〈<
”\n请输入行数:
cin〉>
m;
〈”\n"
co