设为首页 加入收藏

TOP

BFS(三):双向广度优先搜索(五)
2019-07-09 16:10:26 】 浏览:279
Tags:BFS 双向 广度 优先 搜索
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

首页 上一页 2 3 4 5 6 下一页 尾页 5/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇基数排序的可复用实现(C++11/14/.. 下一篇DFS(三):八皇后问题

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目