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;
 } 

运行结果:

非学无以广才,非志无以成学。 正是因为今天的不完美,才对未来充满希望。 ----长帆
原文地址:https://www.cnblogs.com/changfan/p/10970093.html