bfs-广度优先搜索

(只是巩固一下)

bfs和dfs很不一样,虽然都是搜索,但bfs是一层一层地搜索一棵树,dfs是一棵树一棵树地搜索一棵树;bfs适用于求解最优解的问题,而dfs则可以输出不同的解的路径。

bfs一般要依靠struct和queue去实现,但我一般会不用struct而用stl的pair<int,int>,这样再看程序更好理解。

bfs基本结构:

bfs()

{

  初始化队列

  记录队列起点  

  标记已访问

  while(队列不为空)

  {

    if(到达目标) 跳出

    访问周围的点并把它们压进队列

    记录已访问过这些点

  }

}

举个例子:https://www.luogu.com.cn/problem/P1746

像这种求最短、最优解的情况,我们一般用bfs。

以下是本题代码基本框架(bfs):

queue<pair<int,int> > q;
int bfs(int x,int y)
{
    q.push(make_pair(x,y));//将起点压进队列
    vis[x][y]=1;//标记起点已被访问过
    while(!q.empty())//队列不为空
    {
        int u=q.front().first;//记录队首点坐标
        int v=q.front().second;
        q.pop();
        if(u==ta&&v==tb)//如果到达边界值,返回
        return dis[u][v];
        for(int i=1;i<=4;i++)//向前后左右探索
        {
            int tx=u+dx[i];
            int ty=v+dy[i];
            if(tx<1||tx>n||ty<1||ty>n||vis[tx][ty]==true||a[tx][ty]=='1') continue;//如果到达边界,或已访问过,或不能访问,就跳过
            dis[tx][ty]=dis[u][v]+1;//记录到达此点所需步数
            vis[tx][ty]=true;//记录我到此一游
            q.push(make_pair(tx,ty));//将此点坐标压进队列
        }
    }
    return -1;
}

猜你喜欢

转载自www.cnblogs.com/tzh-klng7/p/12284617.html
今日推荐