关注私信免费获取源码
运行截图
核心函数
void FindOut(int** maze, PosType Start, PosType End) {//寻找出路
SqStack S;
S.base = 0;
S = InitStack(S);
PosType curpos;//当前位置
curpos.i = Start.i;
curpos.j = Start.j;
SElemType e;//当前通道块
int curstep = 1;//探索第一步;
do {
if (maze[curpos.i][curpos.j] == 1) {
maze[curpos.i][curpos.j] = 2;//表示留下足迹
e.di = 1;
e.seat.i = curpos.i;
e.seat.j = curpos.j;
e.ord = curstep;
S = Push(S, e);//加入路径
if (curpos.i == End.i && curpos.j == End.j)//到达终点
break;
curpos = NextPos(curpos, 1);
curstep++;//探索下一步
}//if
else {
if (!IsEmpty(S)) {
e = GetTop(S);//由于Pop的不完善,所以这两步加起来才是真正的Pop功能,下同
S = Pop(S);
curstep--;
while (e.di == 4 && !IsEmpty(S)) {
maze[e.seat.i][e.seat.j] = 3;//3表示不能通过的标记
e = GetTop(S);
S = Pop(S);
curstep--;
}
if (e.di < 4) {
e.di++;
S = Push(S, e);
curstep++;
curpos = NextPos(e.seat, e.di);
}//if
}//if
}//else
} while (!IsEmpty(S));
if (IsEmpty(S)) {
maze[Start.i][Start.j] = 1;//因为无论如何起点都会留下足迹
printf("\n无解");
}//if
else {//打印路径
PosType* Path=new PosType[curstep];
//PosType Path[curstep];
int i;
while (!IsEmpty(S)) {
e = GetTop(S);
S = Pop(S);
Path[e.ord - 1].i = e.seat.i;//ord是从1开始计算的,而数组是从0开始
Path[e.ord - 1].j = e.seat.j;
}//while
for (i = 0; i < curstep - 1; i++)//最后一个单独打印
printf("(%d,%d) -> ", Path[i].i, Path[i].j);
printf("(%d,%d)\n", Path[i].i, Path[i].j);
}//else
DestroyStack(S);
}//FindOut
这段代码使用了栈(SqStack)来保存路径信息,并使用深度优先搜索算法来遍历迷宫。在每一步中,根据当前位置和方向进行判断,如果当前位置是可通行的(值为1),则将其标记为已访问(值设为2),并将该位置的信息压入栈中。然后更新当前位置,继续探索下一步。如果当前位置不可通行,则从栈中弹出上一个位置的信息,并尝试其他方向。如果到达终点,则跳出循环。