BFS
广度优先搜索较之深度优先搜索之不同在于,深度优先搜索旨在不管有多少条岔路,先一条路走到底,不成功就返回上一个路口然后就选择下一条岔路,而广度优先搜索旨在面临一个路口时,把所有的岔路口都记下来(需要用到队列(queue)),然后选择其中一个进入,然后将它的分路情况记录下来,然后再返回来进入另外一个岔路,并重复这样的操作
bfs是用来搜索最短径路的解法是比较合适的
比如求最少步数的解,最少交换次数的解,最快走出迷宫等等,因为bfs搜索过程中遇到的第一个解一定是离最初位置最近的,所以遇到第一个解,一定就是最优解,此时搜索算法可以终止
1、从黑色起点出发,记录所有的岔路口(上下左右四个方向),并标记为走一步可以到达的。
2、我们走黑点方块上面的那个,然后将这个路口可走的方向记录下来并标记为2,意味走两步可以到达的地方。
3、接下来,我们回到黑色方块右手边的1方块上,并将它能走的方向也记录下来,同样标记为2,因为也是走两步便可到达的地方
4、同理,可以标出3.4.5的位置
在广度优先搜索中,可以看出是逐步求解的,反复的进入与退出,将当前的所有可行解都记录下来,然后逐个去查看。在DFS中我们说关键点是递归以及回溯,在BFS中,关键点则是状态的选取和标记。
int n = 10, m = 10; //地图宽高
void BFS()
{
queue<node> que; //用队列来保存路口
int graph[n][m]; //地图
int px[] = {-1, 0, 1, 0}; //移动方向的数组
int py[] = {0, -1, 0, 1};
que.push(起点入队); //将起点入队
int step = 0; // 记录扩散的步数
while (!que.empty())
{ //只要队列不为空
int len = que.size();
/* 将当前队列中的所有节点向四周扩散 */
for(int q = 0 ; q < len ; q++)
{
auto temp = que.front();
que.pop(); //得到队列中的元素并弹出
/* 划重点:这里判断是否到达终点 */
if (cur is target)
return step;
for (int i = 0; i < 4; ++i) // 从四个方向搜索
{
int cur_x = que.first + px[i];
int cur_y = que.second + py[i];
if(//可以走)
{
//标记当前格子
//将当前状态入队列,等待下次提取
//graph[cur_x][cur_y] = another_value; 改变当前值状态,否则会走回头路
}
}
}
/* 划重点:更新步数在这里 */
step++;
}
}
参考链接:bfs详细分析