p; return step[cur.x][cur.y]+step[next.x][next.y]+1;
}
}
}
return -1; // 若搜索不成功,表示不可达
}
int main()
{
int nCase,sx,sy,tx,ty,size,i,j;
scanf("%d", &nCase);
while (nCase--)
{
scanf("%d", &size);
for (i=0;i<size;i++)
for (j=0;j<size;j++)
vis[i][j]=step[i][j]=0;
scanf("%d %d", &sx, &sy);
scanf("%d %d", &tx, &ty);
if (sx==tx && sy==ty)
{
printf("0\n");
}
else
{
printf("%d\n",BFS(sx,sy,tx,ty,size));
}
}
return 0;
}
(5)编程思路3。
定义两个队列q1[]和q2[]分别用于两个方向的扩展,两个队列的队头指针和队尾指针分别为front1、front2和rear1、rear2。双向广度优先搜索的框架还可写成:
void BFS()
{
将起始节点放入队列q1,将目的节点放入队列q2;
当两个队列都未空时,作如下循环
{
如果队列q1里的未处理节点比q2中的少(即rear1-front1 < rear2-front2),
则扩展队列q1;
否则扩展队列q2;
}
}
(6)采用两个队列的双向广度优先搜索方法的源程序。
#include <stdio.h>
int vis[305][305], step[305][305];
int dx[] = {-2, -2, -1, 1, 2, 2, 1, -1};
int dy[] = {-1, 1, 2, 2, 1, -1, -2, -2};
struct point
{
int x, y;
};
int BFS(int start_x,int start_y,int end_x,int end_y,int n)
// 在n*n的棋盘中搜索从起点(start_x,strat_y)到终点(end_x,end_y)所需的最少步数
{
int front1,rear1,front2,rear2,i,flag;
point cur,next,q1[45001],q2[45001];
front1=rear1=0;
front2=rear2=0;
cur.x = start_x;
cur.y = start_y;
vis[start_x][start_y] = 1; // 设置正向探索标记为1
q1[rear1++] = cur; &nbs