BFS 算法

Posted changfan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BFS 算法相关的知识,希望对你有一定的参考价值。

一:BFS概念

宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。

 

 

 

所谓广度,就是一层一层的,向下遍历,层层堵截,还是这幅图,我们如果要是广度优先遍历的话,我们的结果是V1 V2 V3 V4 V5 V6 V7 V8。

 

技术图片

 

1、访问顶点vi ;

 

2、访问vi 的所有未被访问的邻接点w1 ,w2 , …wk ;

 

3、依次从这些邻接点(在步骤②中访问的顶点)出发,访问它们的所有未被访问的邻接点; 依此类推,直到图中所有访问过的顶点的邻接点都被访问;

 

问题实例:

技术图片

#include<stdio.h>
struct note
    int x;    //x坐标 
    int y;    //y坐标 
    int f;    //队列标号 
    int s;    //步数 
;
int main()

    struct note que[2501];     //地图大小不会超过50*50
    int book[51][510]=0;    //记录步数,防止一个点被重复走 
    int a[51][51]=0;        //用来存储步数
    
    //定义一个走的数组 
    int next[4][2]=
        0,1,//右走
        1,0,//左走 
        0,-1,//上走 
        -1,0, //下走 
    ; 
    
    int startx,starty,q,p,i,j,k,head,tail,tx,ty; //起点坐标 终点横纵坐标 
    int n,m;    //迷宫的纵横数 
    int flag; 
    
    scanf("%d %d",&n,&m); 
    //输入棋谱 
    for(i=1;i<=n;i++)
    
        for(j=1;j<=m;j++)
        
            scanf("%d",&a[i][j]);
        
        
      
     
     //输入起始坐标和终点坐标
     scanf("%d %d %d %d",&startx,&starty,&p,&q);
     
     //队列的初始化 
     head = 1;
     tail = 1;
     
     //往队列中插入入口坐标
     que[tail].x = startx;
     que[tail].y = starty;
     que[tail].s = 0;
     que[tail].f = 0;
     tail++;
     book[startx][starty] = 1;
     
     flag = 0;
     while(head<tail)
         for(k=0;k<=3;k++)
         
             //枚举四个方向 
             tx = que[head].x + next[k][0];
             ty = que[head].y + next[k][1];
             
             if(tx<1 || ty<1 || tx>n || ty>m)
                 continue;
                 
             if(a[tx][ty] == 0&& book[tx][ty] == 0)
             
                 book[tx][ty] = 1;    //标记为已走过
                que[tail].x = tx;
                que[tail].y = ty;
                que[tail].s = que[head].s + 1;
                tail++;     
             
             
            if(tx == p && ty == q)
            
                flag = 1;
                break;
            
         
        if(flag == 1)
            break; 
         head++;
      
     
    printf("%d",que[tail-1].s);
    getchar();getchar();
    return 0;
  

运行结果:

技术图片

 

以上是关于BFS 算法的主要内容,如果未能解决你的问题,请参考以下文章

(王道408考研数据结构)第六章图-第四节3:最短路径之BFS算法(思想代码演示答题规范)

经典图算法Java代码实践:BFS,DFS以及几种最短路径算法

通过迷宫问题简单学习DFS和BFS算法

通过迷宫问题简单学习DFS和BFS算法

通过迷宫问题简单学习DFS和BFS算法

BFS算法模板与练习