双向广度优先搜索算法:初始状态(正向搜索)和目标状态(逆向搜索)同时向中间搜,当两个方向的搜索生成同一子状态时,搜索结束;一般用来解决最小等最优问题;
如何判断是否生成了同一子状态:(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 &