双向广度优先搜索算法:初始状态(正向搜索)和目标状态(逆向搜索)同时向中间搜,当两个方向的搜索生成同一子状态时,搜索结束;一般用来解决最小等最优问题;
如何判断是否生成了同一子状态:(1)用标记数组,若某一状态未被遍历到,则为0,正向遍历到为1,逆向遍历到为2,当遍历到某一状态时,判断一下其对应标记数组的值;(2)本题(poj1915)代码;
#include<cstdio>
#include<iostream>
#include<queue>;
using namespace std;
#define Maxn 309
struct node
{
int x,y;
};//坐标节点
int n;//图的大小
int fstep[Maxn][Maxn],bstep[Maxn][Maxn];//记录正向搜索和逆向搜索步数
int dir[8][2] = {-1,-2,-2,-1,-2,1,-1,2,1,2,2,1,2,-1,1,-2};
bool isok(node a)
{
if (a.x < 0 || a.x >= n || a.y < 0 || a.y >= n)
return false;
return true;
}
int BBFS(node a,node b)
{
if (a.x == b.x && a.y == b.y)
{
return 0;
}//如果起点和终点一样,则返回0
int i,j;
queue<node>q1,q2;
for (i = 0; i < n; ++i)
{
for (j = 0; j < n; ++j)
fstep[i][j] = bstep[i][j] = -1;
}//步数初始化
fstep[a.x][a.y] = 0;//起点步数=0
bstep[b.x][b.y] = 0;//终点步数=0
q1.push(a);
q2.push(b);

本文介绍了如何运用双向广度优先搜索(Bi-directional BFS)算法来解决POJ1915问题。该算法从初始状态和目标状态同时开始搜索,并在中间相遇时结束,常用于解决最短路径或最小成本问题。判断搜索状态是否相交可通过标记数组检查状态的访问情况,如在本题中,未访问状态标记为0,正向访问为1,逆向访问为2。
最低0.47元/天 解锁文章
3070

被折叠的 条评论
为什么被折叠?



