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

    运行结果:

    非学无以广才,非志无以成学。 正是因为今天的不完美,才对未来充满希望。 ----长帆
  • 相关阅读:
    mysql 的远程链接字符
    SqlSessionFactoryUtil
    mysql 的链接字符
    web 项目运用通用的xml配置
    配置文件转意符使用
    new和newInstance的区别
    子选择器与后代选择器的区别
    Vivado_HLS 学习笔记1-数据类型
    Vivado_HLS 学习笔记3-循环的pipeline与展开
    Vivado_HLS 学习笔记2-接口综合
  • 原文地址:https://www.cnblogs.com/changfan/p/10970093.html
Copyright © 2020-2023  润新知