(只是巩固一下)
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;
}