zoukankan      html  css  js  c++  java
  • 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;
     } 

    运行结果:

    非学无以广才,非志无以成学。 正是因为今天的不完美,才对未来充满希望。 ----长帆
  • 相关阅读:
    Uva 10779 collector's problem
    poj 2728 最优比率树(最小生成树问题)
    LA 3126 二分图匹配 最小路径覆盖
    poj 1149 最大流构图
    Step By Step(Java XML篇)
    Step By Step(Java 输入输出篇)
    Step By Step(Java 集合篇)
    Step By Step(Java 线程篇)
    Step By Step(Java 反射篇)
    Step By Step(Java 国际化篇)
  • 原文地址:https://www.cnblogs.com/changfan/p/10970093.html
Copyright © 2011-2022 走看看