BFS遍历框架

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详细分析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值