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

運行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM