Bootstrap

c++ bfs搜索详讲


一、bfs是什么?

bfs,广度搜索优先,是层序遍历的一种使用
一般用来求没有边权的情况下的最短路径问题
用队列存储
把题目中的问题情况想象成一颗树(数据类型),根据层次来遍历,找最早时间或路程
一般用队列来完成,比dfs节省很多时间

二、bfs怎么用?

bfs模板

bfs和dfs都是有模板的,一般都是以模板为基础进行编码的

//使用STL中的队列
void BFS()
{
   
    首状态结点入队列Q;
    while (!Q.empty()) //队列不空
    {
   
        temp=Q.front();
        if(到达目的状态)
        {
   
            输出结果;
            break;
        }
        Q.pop();
        for (i=1; i<=m; i++) //扩展结点temp的m种可能
            if (可以扩展)
            {
   
                处理每种可能情况;
                扩展结点入队列;
            }
    }
}

当然,题目不可能丝毫不变考模板的,而模板十分局限,只能表明一些思路

简单例题1

题目:鸡飞狗不跳

有一只鸡和一条狗,他们在一条线上,鸡的位置在点N处,狗在点M处,鸡和狗约定,狗站那不动,鸡
去找狗。可以一次向左或向右走一步,也可一次飞到原来所在位置的2倍处。鸡飞一次和走一步时间相
同。为了不让狗等得着急,鸡最快多长时间能到狗的位置。

输入格式:

多组测试数据,每组一行N,M(0<=N,M<=100000).

输出格式:

输出鸡到狗位置的最短时间.

限制:

空间限制:32MByte
时间限制:1秒

样例:

输入:

5 17
输出:

4

这是一个一维的dfs题,也是最简单的一种
代码:

#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
int n,m;

struct nood{
   
	int x;		//记坐标 
	int step;	//记次数 
};
int nums[120000];

int bfs(){
   
	queue<nood>q;	//队列 用来存nood 里的坐标和每一次的次数 
	nood root;	//第一个节点(根节点) 
	root.x=n;
	root.step=0;
	q.push(root);
	nums[n]=1;	//确保没有走过 
	
	while(q.size()){
   	//层次遍历路径 
		nood x=q.front();q.pop();
		if(x.x==m){
   	//截止条件 
			return x.step;	//返回截止时的次数 
		}
		int tx=x.x+1;	//当鸡往前走时 
		if(tx>=1&&tx<=110000&&!nums[tx]){
   
			nood p;
      		nums[tx]=1;	//标记已走过 
			p.x=tx;
			p.step=x.step+1;
			q.push(p);
		}
		tx=x.x-1;		//当鸡往后走时 
		if(tx>=1&&tx<=110000&&!nums[tx]){
   
			nood p;
      		nums[tx]=1;
			p.x=tx;
			p.step=x.step+1
;