大数据结构 迷宫求解.docx
- 文档编号:25711905
- 上传时间:2023-06-11
- 格式:DOCX
- 页数:17
- 大小:64.55KB
大数据结构 迷宫求解.docx
《大数据结构 迷宫求解.docx》由会员分享,可在线阅读,更多相关《大数据结构 迷宫求解.docx(17页珍藏版)》请在冰豆网上搜索。
大数据结构迷宫求解
【完成题目3】迷宫求解
【问题描述】
以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。
设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
【基本要求】
首先实现一个栈类型,然后编写一个求解迷宫的非递归程序。
求得的通路以三元组(i,j,d)的形式输出,其中(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。
【算法设计】
本实验的目的是设计一个程序,实现手动或者自动生成一个n×m矩阵的迷宫,寻找一条从入口点到出口点的通路。
我们将其简化成具体实验内容如下:
选择手动或者自动生成一个n×m的迷宫,将迷宫的左上角作入口,右下角作出口,设“0”为通路,“1”为障碍,即无法穿越。
假设从起点出发,目的为右下角终点,可向“上、下、左、右、左上、左下、右上、右下”8个方向行走。
如果迷宫可以走通,则用“■”代表“1”,用“□”代表“0”,用“→”代表行走迷宫的路径。
输出迷宫原型图、迷宫路线图以及迷宫行走路径。
如果迷宫为死迷宫,输出信息。
可以二维数组存储迷宫数据,用户指定入口下标和出口下标。
为处理方便起见,可在迷宫的四周加一圈障碍。
对于迷宫中任一位置,均可约定有东、南、西、北四个方向可通。
本程序包含三个模块
1)主程序模块:
voidmain()
{
初始化;
do{
接受命令;
处理命令;
}while(命令!
=退出);
}
2)栈模块——实现栈抽象数据类型;
3)迷宫模块——实现迷宫抽象数据类型。
【源代码】
#include
#include
#include
#include
#defineOK1
#defineERROR0
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
#defineOVERFLOW-1
#defineM49
#defineN49
usingnamespacestd;
intmaze[M][N];
typedefintStatus;
typedefstruct
{
intm,n,direc;
}MazeType,*LMazeType;
typedefstruct
{
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表示障碍:
"< for(i=1;i for(j=1;j cin>>maze[i][j]; for(i=1;i { for(j=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; cout<<"\n迷宫生成中……\n\n"; system("pause"); for(i=1;i for(j=1;j maze[i][j]=rand()%2;//随机生成0、1 } voidPrintMaze(intmaze[M][N],introw,intcol) { inti,j; cout<<"迷宫如图所示."< for(i=1;i { for(j=1;j { if(maze[i][j]==1) cout<<"■"; else cout<<"□"; } cout< } } StatusInitStack(Stack&S) { S.base=(LMazeType)malloc(STACK_INIT_SIZE*sizeof(MazeType)); if(! S.base)exit(OVERFLOW); S.top=S.base; S.stacksize=STACK_INIT_SIZE; S.over=0; returnOK; } StatusPush(Stack&S,MazeTypee) { if(S.top-S.base>=S.stacksize) { S.base=(LMazeType)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(MazeType)); if(! S.base)exit(OVERFLOW); S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *S.top++=e; returnOK; } StatusPop(Stack&S,MazeType&e) { if(S.top==S.base)returnERROR; e=*--S.top; returnOK; } 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;//表示存满一条路径 returnOK; } else{ e.n++; e.direc=0;//来这一点时的方向,0右1下2左3上 MazePath(S,e,maze,m,n); } } else { if(S.top! =S.base&&S.over! =1) { switch(e.direc)//回到上一位置并同时改变方向走下一步 { case0: e.n--; e.m++; e.direc=1; break; case1: e.m--; e.n--; e.direc=2; break; case2: e.n++; e.m--; e.direc=3; break; case3: Pop(S,e); break; } } } }while(S.top! =S.base&&S.over! =1); returnOK; } intPrintPath(StackS,intmaze[M][N],introw,intcol) { if(S.top==S.base) { cout<<"\n===============================================\n"; cout<<"此迷宫无解\n\n"; returnERROR; } MazeTypee; while(S.top! =S.base) { Pop(S,e); maze[e.m][e.n]=(e.direc+10); } cout<<"完成! "< cout<<"\n===============================================\n"; cout<<"路径为: "< inti,j; for(i=1;i { for(j=1;j { switch(maze[i][j]) { case0: cout<<"□"; break; case1: cout<<"■"; break; case2: cout<<"※"; break; case10: cout<<"→"; break; case11: cout<<"↓"; break; case12: cout<<"←"; break; case13: cout<<"↑"; break; } } cout< } cout<<"入口"< cout<<"完成! "< returnOK; } intmain() { inti,m,n,maze[M][N],cycle=0; while(cycle! =(-1)) { cout<<"********************************************************************************\n"; cout<<"欢迎进入迷宫求解系统\n"; cout< cout<<"********************************************************************************\n"; cout<<"☆1手动生成迷宫☆\n"; cout<<"☆2自动生成迷宫☆\n"; cout<<"☆3退出☆\n\n"; cout<<"********************************************************************************\n"; cout<<"\n"; cout<<"请选择你的操作: \n"; cin>>i; switch(i) { case1: cout<<"\n请输入行数: "; cin>>m; cout<<"\n"; cout<<"请输入列数: "; cin>>n; while((m<1||m>49)||(n<1||n>49)) { cout<<"\n抱歉,你输入的行列数超出预设范围(1-49,1-49),请重新输入: \n\n"; cout<<"\n请输入行数: "; cin>>m; cout<<"\n"; cout<<"请输入列数: "; cin>>n; } Init_hand_Maze(maze,m,n); PrintMaze(maze,m,n); MazeTypestart,end; cout<<"请输入起点mn: "< cin>>start.m>>start.n; start.direc=0; cout<<"请输入终点mn: "< cin>>end.m>>end.n; StackS; cout<<"寻找路径..."< InitStack(S); MazePath(S,start,maze,end.m,end.n); PrintPath(S,maze,m,n); system("pause"); cout<<"\n\nPressEnterContiue! \n"; getchar(); while(getchar()! ='\n');//接受一个输入,当为回车时执行break跳出,否则一直执行接受数据 break; case2: cout<<"\n请输入行数: "; cin>>m; cout<<"\n"; cout<<"请输入列数: "; cin>>n; while((m<0||m>49)||(n<0||n>49)) { cout<<"\n抱歉,你输入的行列数超出预设范围(0-49,0-49),请重新输入: \n\n"; cout<<"\n请输入行数: "; cin>>m; cout<<"\n"; cout<<"请输入列数: "; cin>>n; } Init_automatic_Maze(maze,m,n); PrintMaze(maze,m,n); cout<<"请输入起点mn: "< cin>>start.m>>start.n; start.direc=0; cout<<"请输入终点mn: "< cin>>end.m>>end.n; cout<<"寻找路径..."< InitStack(S); MazePath(S,start,maze,end.m,end.n); PrintPath(S,maze,m,n); system("pause"); cout<<"\n\nPressEnterContiue! \n"; getchar(); while(getchar()! ='\n'); break; case3: cycle=(-1);break; default: cout<<"\n";cout<<"你的输入有误! \n"; cout<<"\nPressEnterContiue! \n"; getchar(); while(getchar()! ='\n'); break; } } } 【结果截图】 迷宫无解的情况 手动生成迷宫的情况 自动生成迷宫的情况 【收获及体会】 1.本次实验核心算法明晰,思路明确,易于实现。 遇到的问题是,迷宫的外围若未设置障碍,用此程序采用的求解迷宫路径的算法无法获得正确结果。 2.本程序的MazePath算法代码不够简洁,但不影响算法实现。 3.本次实验由于时间问题和知识水平有限,还存在一些问题,比如: 界面比较单调,整个程序的功能还不完善,还有界面做的有些简单,菜单没有做好,可进行的操作太少,这些都有待进一步改善。 4.本次实验使我对迷宫游戏的原理有了一定的了解,但做出的结果离真正的迷宫还有很大差距,还需要进一步完善,需要自己课下学习更多的知识。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 大数据结构 迷宫求解 数据结构 迷宫 求解