在上一篇中我们通过深度优先搜索找到迷宫从入口到终点的最短路径,这次我们换一种思路,通过一层一层扩展的方法来找到终点,扩展时每发现一个点就将这个点加入到队列中,直至走到终点位置为止,即广度优先搜索(BFS)。
算法图解
依然是以下面这个迷宫为例,我们需要找到从起点到终点的最短路径。
广度优先的思想就是遍历每一步能到达的所有位置,判断这些位置是否为终点,如果都不是就找到下一步能到达的所有位置,直到到达终点。例如起点处能到达(1,2)和(2,1),都不是终点,那么我们继续看这两个点能到达(2,2),(3,1),(2,3),仍然没有到达终点,继续向前找,如下:
回顾刚才的算法,我们可以用一个队列来模拟,队列中通过结构体来存储我们需要的信息。
struct note
{
public int x; //横坐标
public int y; //纵坐标
public int f; //上一步在队列中的编号
public int s; //步数
}
//队列初始化
head = tail = 1;
//将起点坐标加入到队列
startx = starty = 1;
que[tail] = new note()
{
x = startx,
y = starty,
f = 0,
s = 0
};
tail++;
然后从(1,1)开始,先尝试右走到达(1,2)。
//计算下一个点的坐标
tx = que[head].x + next[k][0];
ty = que[head].y + next[k][1];
判断(1,2)是否越界
if (tx < 1 || tx > n || ty < 1 || ty > m)
{
continue;
}
再判断(1,2)是否为障碍物或者已经在路径中。
if (a[tx][ty] == 0 && book[tx][ty] == 0)
{
}
如果满足上面的条件