迷宫求解(C语言)
2008-06-27 13:18
211 查看
任务:可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;
要求:在上交资料中请写明:存储结构、基本算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法;
#include<stdio.h>
#include<stdlib.h>
#defineMAXNUM100/*栈中最大元素个数*/
#defineN11/*地图的第一维长度*/
typedefstruct{
intx;/*行下标*/
inty;/*列下标*/
intd;/*运动方向*/
}DataType;
structSeqStack{/*顺序栈类型定义*/
intt;/*指示栈顶位置*/
DataTypes[MAXNUM];
};
typedefstructSeqStack*PSeqStack;/*顺序栈类型的指针类型*/
PSeqStackpastack;/*pastack是指向顺序栈的一个指针变量*/
PSeqStackcreateEmptyStack_seq(void){
PSeqStackpastack;
pastack=(PSeqStack)malloc(sizeof(structSeqStack));
if(pastack==NULL)
printf("Outofspace!!/n");
else
pastack->t=-1;
returnpastack;
}
intisEmptyStack_seq(PSeqStackpastack){
returnpastack->t==-1;
}
/*在栈中压入一元素x*/
voidpush_seq(PSeqStackpastack,DataTypex){
if(pastack->t>=MAXNUM-1)
printf("Overflow!/n");
else{
pastack->t++;
pastack->s[pastack->t]=x;
}
}
/*删除栈顶元素*/
voidpop_seq(PSeqStackpastack){
if(pastack->t==-1)
printf("Underflow!/n");
else
pastack->t--;
}
/*当pastack所指的栈不为空栈时,求栈顶元素的值*/
DataTypetop_seq(PSeqStackpastack){
return(pastack->s[pastack->t]);
}
voidpushtostack(PSeqStackst,intx,inty,intd){
DataTypeelement;
element.x=x;
element.y=y;
element.d=d;
push_seq(st,element);
}
voidprintpath(PSeqStackst){
DataTypeelement;
printf("/n/nThepathis:/n");
while(!isEmptyStack_seq(st)){
element=top_seq(st);
pop_seq(st);
printf("/nthenodeis:line%darrange%d/n",element.x,element.y);/*打印路径上的每一点*/
}
}
/*迷宫maze[M]
中求从入口maze[x1][y1]到出口maze[x2][y2]的一条路径*/
/*其中1<=x1,x2<=M-2,1<=y1,y2<=N-2*/
voidmazePath(intmaze[]
,intdirection[][2],intx1,inty1,intx2,inty2){
inti,j,k,g,h;
PSeqStackst;
DataTypeelement;
st=createEmptyStack_seq();
maze[x1][y1]=2;/*从入口开始进入,作标记*/
pushtostack(st,x1,y1,-1);/*入口点进栈*/
while(!isEmptyStack_seq(st)){/*走不通时,一步步回退*/
element=top_seq(st);
pop_seq(st);
i=element.x;j=element.y;
for(k=element.d+1;k<=3;k++){/*依次试探每个方向*/
g=i+direction[k][0];h=j+direction[k][1];
if(g==x2&&h==y2&&maze[g][h]==0){/*走到出口点*/
printpath(st);/*打印路径*/
return;
}
if(maze[g][h]==0){/*走到没走过的点*/
maze[g][h]=2;/*作标记*/
pushtostack(st,i,j,k);/*进栈*/
i=g;j=h;k=-1;/*下一点转换成当前点*/
}
}
}
printf("/nThepathhasnotbeenfound./n");/*栈退完未找到路径*/
}
intmain(){
intdirection[][2]={0,1,1,0,0,-1,-1,0};
intmaze[][11]={
1,1,1,1,1,1,1,1,1,1,1,
1,0,1,0,0,1,1,1,0,0,1,
1,0,0,0,0,0,1,0,0,1,1,
1,0,1,1,1,0,0,0,1,1,1,
1,0,0,0,1,0,1,1,0,1,1,
1,1,0,0,1,0,1,1,0,0,1,
1,1,1,0,0,0,0,0,0,0,1,
1,1,1,1,1,1,1,1,1,1,1
};
intx1,x2,y1,y2;
printf("/nfromwhere?(lineandarrange)");
printf("/ninputlineandarrange(line>1,arrange>1):");
scanf("%d%d",&x1,&y1);
printf("/nwheretoend?(lineandarrange)");
printf("/ninputlineandarrange(line<=6,arrange<=9):");
scanf("%d%d",&x2,&y2);
mazePath(maze,direction,x1,y1,x2,y2);
return0;
}
相关文章推荐
- 使用深度优先搜索算法来求解迷宫问题(C语言)
- 迷宫求解(C语言回溯法)
- C语言 迷宫问题求解(顺序栈应用示例)
- C语言实现迷宫求解问题(附源代码)
- C语言 迷宫求解
- 迷宫问题的C语言求解
- C语言迷宫求解
- 用C语言实现迷宫求解问题
- C语言 数据结构中求解迷宫问题实现方法
- C语言实现迷宫求解
- 迷宫问题的C语言求解
- C语言 迷宫问题求解(顺序栈应用示例)
- C语言迷宫求解(完结版)
- C语言用顺序栈求解迷宫问题
- 黑马程序员--C语言自学笔记---09排序、查找、迷宫、字符串
- Java算法---华为oj迷宫问题求解(广度优先搜索)
- C语言-数据结构-递归求解实例-8皇后问题
- 深度优先搜索(DFS)求解迷宫问题
- C/C++求解迷宫算法
- 最简单的迷宫求解