迷宫求解(DFS),栈实现,数据结构笔记

迷宫求解深度优先(DFS),栈实现

笔记来源:B站“懒猫老师”的视频
连接

思想:从一点出发,按照右下左上的顺序依次探路,如果下一步的位置能走(没走过且不是障碍),就移动到下一步,反之,选择下一个方向
如果所有方向都不能走,则回退一步,如果上一步还有方向没有选完,所以选择上一步的其他方向,反之则继续退步。

迷宫结构:
在这里插入图片描述
左上角小人代表起点,右下角的代表终点。
在这里插入图片描述

我们定义一个二维数组maze[M+2][N+2]来存储迷宫
具体用数组存储就是上图的样子

maze[x][y] = 0:该位置没走过且不是障碍
maze[x][y] = 1:障碍
maze[x][y] = -1:该位置走过了

方向试探:
typedef struct{
	int incX,incY
}Direction
Direction direct[4];
从某点(x,y)按某一方向v(0<=v<=3)到达新点(line,col)的坐标
line=x+direct[v].incX;
col=y+direct[v].incY;
direct[0]:incX=0,incY=1     向右走一步
direct[1]:incX=1,incY=0     向下走一步
direct[2]:incX=0,incY=-1    向左走一步
direct[3]:incX=-1,incY=0    向下走一步
typedef struct{
	int x,y         当前访问的迷宫格子的坐标;
	int di;         当前方向
}Box;           //用于记录当前坐标以及下一步所走的方向

实现方法:

bool findPath(int maze[M+2][N+2], Direction direct[],Stack &s)
{
Box temp;              
int x,y,di;
int line col;
maze[1][1]=-1;
temp={1,1,-1};
s.push(s,temp)
while(!s.isEmpty())
{
	temp=s.pop;                                        //退一步
	x=temp.x;y=temp.y;di=temp.di+1;
	while(di<4)
	{
		line=x+direct[di].incX;
		col=x+direct[di].incY;
		if(maze[line][col]==0)             				//下一步没走过且不是障碍
			{
				temp={x,y,di}              
				s.push(temp);			  				 //把这一步的位置和方向全部压栈
				x=line; y=col maze[line][col]=-1		//移动到下一步
				if(x==M&&y=N) return true;				//如果移动到终点,结束程序
				else di=0;                              //方向重置
			}
		else di++;										//换一个方向
	}
}

return false;
}

程序执行完后会得到一个新的栈,如果栈为空,则表示迷宫没有路径能够走到终点。如果不为空,则将栈逆序后会得到一个完整的路径。

上图实现步骤:红色箭头代表了一个正确路径,右边数组表示走过的格子坐标
在这里插入图片描述
注意到一点:红色箭头指向的路径并不是最短路径,也不是唯一路径,这是由于所选的算法是深度优先

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页