迷宫求解源程序.docx
- 文档编号:9199662
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:11
- 大小:17.06KB
迷宫求解源程序.docx
《迷宫求解源程序.docx》由会员分享,可在线阅读,更多相关《迷宫求解源程序.docx(11页珍藏版)》请在冰豆网上搜索。
迷宫求解源程序
附录(源程序清单包括递归与非递归算法)
递归算法
#include
#include
intvisit(int,int);
intmaze[7][7]={{2,2,2,2,2,2,2},
{2,1,1,1,1,1,2},
{2,1,2,1,2,1,2},
{2,1,1,2,1,2,2},
{2,2,1,2,1,2,2},
{2,1,1,1,1,1,2},
{2,2,2,2,2,2,2}};
intstartI=1,startJ=1;//入口
intendI=5,endJ=5;//出口
intsuccess=0;
intmain(void){
inti,j;
printf("显示迷宫:
\n");
for(i=0;i<7;i++){
for(j=0;j<7;j++)
if(maze[i][j]==2)
printf("█");
else
printf("");
printf("\n");
}
if(visit(startI,startJ)==0)
printf("\n没有找到出口!
\n");
else{
printf("\n显示路径:
\n");
for(i=0;i<7;i++){
for(j=0;j<7;j++){
if(maze[i][j]==2)
printf("█");
elseif(maze[i][j]==0)
printf("◇");
else
printf("");
}
printf("\n");
}
}
return0;
}
intvisit(inti,intj){
maze[i][j]=0;
if(i==endI&&j==endJ)
success=1;
if(success!
=1&&maze[i][j+1]==1)
{printf("向右");
visit(i,j+1);
}
if(success!
=1&&maze[i+1][j]==1)
{printf("向下");
visit(i+1,j);}
if(success!
=1&&maze[i][j-1]==1)
{printf("向左");visit(i,j-1);}
if(success!
=1&&maze[i-1][j]==1)
{printf("向上");
visit(i-1,j);
}
if(success!
=1)
maze[i][j]=1;
returnsuccess;
}
说明由于迷宫的设计,走迷宫的入口至出口路径可能不只一条,解法求所有路径看起来复杂但其实更简单,只要走至出口时显示经过的路径,然后退回上一格重新选择下一个位置继续递回就可以了,比求出单一路径还简单,我的程序只要作一点修改就可以了。
#include
#include
voidvisit(int,int);
intmaze[9][9]={{2,2,2,2,2,2,2,2,2},
{2,1,1,1,1,1,1,1,2},
{2,1,2,2,1,2,2,1,2},
{2,1,2,1,1,2,1,1,2},
{2,1,2,1,2,1,2,1,2},
{2,1,1,1,1,1,2,1,2},
{2,2,1,2,2,1,2,2,2},
{2,1,1,1,1,1,1,1,2},
{2,2,2,2,2,2,2,2,2}};
intstartI=1,startJ=1;//入口
intendI=7,endJ=7;//出口
intmain(void){
inti,j;
printf("显示迷宫:
\n");
for(i=0;i<9;i++){
for(j=0;j<9;j++)
if(maze[i][j]==2)printf("█");
elseprintf("");
printf("\n");
}
visit(startI,startJ);
return0;
}
voidvisit(inti,intj){
intm,n;
maze[i][j]=0;
if(i==endI&&j==endJ){
printf("\n显示路径:
\n");
for(m=0;m<9;m++){
for(n=0;n<9;n++)
if(maze[m][n]==2)
printf("█");
elseif(maze[m][n]==0)
printf("◇");
else
printf("");
printf("\n");
}
}
if(maze[i][j+1]==1)visit(i,j+1);
if(maze[i+1][j]==1)visit(i+1,j);
if(maze[i][j-1]==1)visit(i,j-1);
if(maze[i-1][j]==1)visit(i-1,j);
maze[i][j]=1;
}
非递归算法
#include
#include
typedefstruct{
unsignedord,x,y;/*通道块在路径上的序号和在迷宫中的坐标位置*/
shortdi;/*从此通道块走向下一通道块的“方向”*/
}ElemType;
typedefstructNode{/*定义单链表*/
ElemTypedata;
structNode*next;
}Node,*LinkList;
typedefstruct{/*定义链栈结构*/
LinkListtop;/*栈顶指针*/
unsignedlength;/*栈中元素个数*/
}LStack;
voidDestroyStack(LStack*S)/*销毁栈*/
{LinkListq;
while(S->top){
q=S->top;
S->top=S->top->next;/*修改栈顶指针*/
free(q);/*释放被删除的结点空间*/
}
S->length=0;
}
voidInitStack(LStack*S)/*构造空栈*/
{
S->top=NULL;/*栈顶指针初值为空*/
S->length=0;/*空栈中元素个数为0*/
}
intPop(LStack*S,ElemType*e)
{/*若栈不空,则删除S的栈顶元素,用e返回栈顶元素的值。
*/
LinkListq;
if(!
S->top){
return0;
}
*e=S->top->data;/*返回栈顶元素*/
q=S->top;
S->top=S->top->next;/*修改栈顶指针*/
--S->length;/*栈的长度减1*/
free(q);/*释放被删除的结点空间*/
return1;
}
intPush(LStack*S,ElemTypee)
{/*在栈顶之上插入元素e为新的栈顶元素*/
LinkListp=malloc(sizeof*p);/*建新的结点*/
if(!
p){
return0;/*存储分配失败*/
}
p->data=e;
p->next=S->top;/*链接到原来的栈顶*/
S->top=p;/*移动栈顶指针*/
++S->length;/*栈的长度增1*/
return1;
}
voidNextPos(unsigned*,unsigned*,short);/*定位下一个位置*/
intmain(void)
{
LStackS,T;
unsignedx,y,curstep,i=0;/*迷宫坐标,探索步数*/
ElemTypee;
charmaze[10][10]={
{'#','','#','#','#','#','#','#','#','#'},
{'#','','','#','','','','#','','#'},
{'#','','','#','','','','#','','#'},
{'#','','','','','#','#','','','#'},
{'#','','#','#','#','','','','','#'},
{'#','','','','#','','','','','#'},
{'#','','#','','','','#','','','#'},
{'#','','#','#','#','#','#','#','','#'},
{'#','#','','','','','','','','#'},
{'#','#','#','#','#','#','#','#','','#'},
};
InitStack(&S);
InitStack(&T);
printf("迷宫图形,#号代表墙壁,空格代表通路:
\n");
for(x=0;x<10;x++){
for(y=0;y<10;y++)
printf("%c",maze[x][y]);
printf("\n");
}
x=1;/*迷宫起点*/
y=0;
curstep=1;/*探索第一步*/
do{/*进入迷宫*/
if(maze[y][x]==''){/*如果当前位置可以通过*/
maze[y][x]='1';/*留下足迹*/
e.x=x;
e.y=y;
e.di=1;
e.ord=curstep;
if(!
Push(&S,e)){/*加入路径,即压栈*/
fprintf(stderr,"内存不足。
\n");
}
if(x==8&&y==9){/*到达终点*/
break;
}
NextPos(&x,&y,1);/*下一位置是当前位置的东邻*/
curstep++;
}
else{/*如果当前位置不能通过*/
if(S.length!
=0){
Pop(&S,&e);
while(e.di==4&&S.length!
=0){
maze[e.y][e.x]='0';/*留下不能通过足迹*/
Pop(&S,&e);/*退回一步,即出栈*/
}
if(e.di<4){
e.di++;
if(!
Push(&S,e)){/*加入路径,即压栈*/
fprintf(stderr,"内存不足。
\n");
}
x=e.x;/*重置坐标*/
y=e.y;
NextPos(&x,&y,e.di);/*寻找下一位置*/
}
}
}
}while(S.length!
=0);
printf("走出迷宫路线,1代表走过的路,0代表试探过的路径\n");
for(x=0;x<10;x++){
for(y=0;y<10;y++){
printf("%c",maze[x][y]);
if(maze[x][y]=='1')
i++;
}
printf("\n");
}
for(x=0;x
{Pop(&S,&e);
Push(&T,e);
}
printf("出迷宫顺序,(X坐标,Y坐标,前进方向):
\n");
while(T.length!
=0)
{printf("(%d,%d,%d)\t",T.top->data.x,T.top->data.y,T.top->data.di);
Pop(&T,&e);
}
DestroyStack(&S);
getchar();
return0;
}
voidNextPos(unsigned*x,unsigned*y,shortdi)/*定位下一个位置*/
{
switch(di){
case1:
++(*x);break;
case2:
++(*y);break;
case3:
--(*x);break;
case4:
--(*y);break;
default:
break;
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 迷宫 求解 源程序
![提示](https://static.bdocx.com/images/bang_tan.gif)