最近几天学习数据结构的栈,碰巧看到了一个迷宫寻找路径的算法,稍微琢磨了一下。
1。为了简化,迷宫设计成数字样式,如下:
定义入口坐标为(1,1),出口坐标为(6,8)。
1代表不通,0代表通路,迷宫四周全为1。这样使每个点都可以向上下左右四个方向试探,不用判断当前的试探方向有几个。
2。
规定从(x,y+1)开始沿顺时针方向开始试探,将四个方向坐标放在一个move[4]数组里面。
typedef struct{
int x,y;
}item;
item move[4];
则新坐标为x=x+move[i].x,y=y+move[i].y;
3。 进栈元素为到达的各点坐标,还有前一点到达本点的方向,如下:
typedef struct{
int x,y,d;
}DataType;
栈仍然为顺序栈。
4。为了防止走重复的路,将每次走过的点maze[i]设为-1,起到区别作用。
5。算法思想:
(1)栈初始化。
(2)将入口坐标及到达该点的方向(设为-1)入栈。
(3)while(栈不空)
{
出栈;
试探下一个方向,d++;
while(存在剩余可以试探的方向)
{
if(d方向可走)
{
将(x,y,d)入栈;
求新点坐标(i,j);
将新点(i,j)换成当前点(x,y);
if((x,y)==(m,n))
{
m,n进栈;
结束;
}
else
重置d=0;
}
else d++;
}
}
6。算法如下,顺序栈部分代码参考上一篇博客
/*求迷宫路径,入口参数:指向迷宫数组的指针,下标移动的增量数组,开始点(x0,y0),到达点(m,n),
返回值:1表示求出路径,0表示无路径*/
int MazePath(int maze[][n + 2] ,Item move[],int x0,int y0)
{
PSeqStack S;
DateType temp;
int x,y,d,i,j;
temp.x = x0;
temp.y = y0;
temp.d = -1;
S = Init_SeqStack();
if(!S)
{
printf("初始化失败!\n");
return 0;
}
Push_SeqStack(S,temp); //迷宫入口点入栈
while(!Empty_SeqStack(S))
{
Pop_SeqStack(S,&temp);
x = temp.x;
y = temp.y;
d = temp.d + 1;
while(d < 4) //向剩余方向搜索
{
i = x + move[d].x;
j = y + move[d].y;
if(maze[i][j] == 0) //此方向可以走
{
temp.x = x;
temp.y = y;
temp.d = d;
Push_SeqStack(S,temp); //点(x,y)可以走,用栈保存路径
x = i;
y = j;
maze[x][y] = -1;
if(x == m && y == n)
{
temp.x = m;
temp.y = n;
Push_SeqStack(S,temp);
while(!Empty_SeqStack(S))
{
Pop_SeqStack(S,&temp);
printf("(%d,%d) <- ",temp.x,temp.y);
}
Destory_SeqStack(&S);
return 1;
}
else
d = 0; //方向复位
}
else
d++; //试探下一个方向
}
}
Destory_SeqStack(&S);
return 0;
}