这一步实际上就是走到终点后,如何能够打印出正确的一条路。
上一篇走迷宫的博客中已经写明了如何走出迷宫,这次只是对其的升华,如何来输出一个正确的路线?
由于计算机会尝试多条路径都走到底试一遍才能找到最后的终点,所以如何输出正确的路线也不是很简单的事。
具体代码如下:
mystack.h 和 mystack.cpp 跟走迷宫是一样的,可以翻阅 深度优先搜索(走迷宫)这篇 。
main函数代码如下:
#include <iostream>
#include"mystack.h"
#include <windows.h>
#define MAXROW 10
#define MAXLINE 10
//宏定义把迷宫 长宽都定义成10
using namespace std;
Stack s; //变成全局,方便调用
Point prePoint[MAXROW][MAXLINE];//创建一个二维坐标
int maze[MAXROW][MAXLINE] =
{
1,1,1,1,1,1,1,1,1,1,
0,0,0,1,1,1,1,1,1,1,
1,1,0,1,1,1,1,1,1,1,
1,1,0,0,0,0,1,1,1,1,
1,1,0,1,1,0,1,1,1,1,
1,1,0,1,0,0,0,1,1,1,
1,1,1,1,1,0,1,1,1,1,
1,1,1,1,1,0,0,0,1,1,
1,1,1,1,1,1,1,0,0,0,
1,1,1,1,1,1,1,1,1,1,
};
void displyMaze()
{
for(int i=0; i< MAXROW; i++)
{
for(int j=0; j<MAXLINE; j++)
{
if(maze[i][j] == 1) printf("%2s"," *"); //代表迷宫的墙
else if(maze[i][j] == 2) printf("%2s"," #"); //代表走过的路,用#代表
else printf("%2s"," "); //代表迷宫的路
}
putchar(10);
}
printf(" ====================\n");
}
void displayPrePoint()
{
for(int i=0; i< MAXROW; i++)
{
for(int j=0; j<MAXLINE; j++)
{
printf(" (%2d,%2d) ",prePoint[i][j]);
}
putchar(10);
}
printf(" ====================\n");
}
void visit(int x,int y,Point lastP )
{
Point p={x,y};
push(&s,p);
prePoint[x][y]=lastP; //这里存储的是上一步为已经弹出栈的点
//这样就形成了每个点都存储了上一个位置的点的二维数组
}
int main()
{
Point sp={1,0},ep={8,9};//迷宫起点和终点(结构体只能这样初始化)
memset(prePoint,0xff,sizeof(Point)*MAXLINE*MAXROW);
initStack(&s);
push(&s,sp);
int flag=1;
#if 1
while(!isStackEmpty(&s))
{
Point t;
t=pop(&s); //弹出栈里存的点(这个点就是当前位置的点)
maze[t._x][t._y]=2; //表示走过的路,标记为 2
system("cls"); //这是自动寻路刷新界面,然后有寻路动画
displyMaze();
Sleep(100);
//竖是x轴. 横是y轴(数组的原理)
//判断各方向的点能不能走,1.坐标从0开始 2.不能是死路 3.不能是走过的路
//上
if(t._x-1>=0&&maze[t._x-1][t._y] == 0)
visit(t._x-1,t._y,t); //这个 t 指的是移动前,自己原来弹出栈的这个点
//下
if(t._x+1<=9&&maze[t._x+1][t._y] == 0)
visit(t._x+1,t._y,t);
//左
if(t._y-1>=0&&maze[t._x][t._y-1] == 0)
visit(t._x,t._y-1,t);
//右
if(t._y+1<=9&&maze[t._x][t._y+1] == 0)
visit(t._x,t._y+1,t);
if(t._x==ep._x&&t._y==ep._y)
{
flag=0; //给定找到出口的标志位
destroyStack(&s);
break;
}
}
#endif
if(flag==0)
{
cout<<"find path"<<endl;
}
else
cout<<"find no path"<<endl;
displayPrePoint();
Point t=ep;
while(t._y!=-1) //如果有出口,从出口终点,一步一步寻找这个点存储的上一次的点
{
printf(" (%d,%d) ",t._x,t._y);
t=prePoint[t._x][t._y];
}
//按这步,然后进行反转就形成了正确的路线,也就形成了自动寻路
return 0;
}