廣度優先搜尋

2021-08-29 07:35:03 字數 2603 閱讀 7428

是最簡便的圖的搜尋演算法之一,這一演算法也是很多重要的圖的演算法的原型。dijkstra單源最短路徑演算法和prim最小生成樹演算法都採用了和寬度優先搜尋類似的思想。其別名又叫bfs,屬於一種盲目搜尋法,目的是系統地展開並檢查圖中的所有節點,以找尋結果。換句話說,它並不考慮結果的可能位置,徹底地搜尋整張圖,直到找到結果為止。

下面我們還是通過乙個例子來分析:

有一天,小哈乙個人去玩迷宮,但方向感不太好的他很快就迷路了。迷宮由n行m列的單元格組成,每個單元格要麼是空地,要麼是障礙物。你的任務就是幫助小哈找到一條從迷宮的起點通往小哈所在位置的最短路徑。

首先我們可以用乙個二維陣列來儲存這個迷宮,剛開始的時候,小哈處於迷宮的入口處(1,1),小哈在(p,q)。其實就是找從(1,1)到(p,q)的最短路徑。廣搜就是通過「一層一層」擴充套件的方法來找到小哈。擴充套件時每發現乙個點就將這個點加入到佇列中,直至走到小哈的位置(p,q)是位置。這個擴充套件的過程可以用乙個佇列來模擬,這裡我們用乙個結構體來實現佇列。

struct note

;struct note que[2501];

int head,tail;

int a[51][51] = ;//用來儲存地圖

int book[51][51] = ;//陣列book的作用是記錄哪些點已經在佇列中了。

//防止乙個點被重複擴充套件,並全部初始化為0.

//最開始的時候需要進行佇列初始化,即將佇列設定為空。

head = 1;

tail = 1;

//第一步將(1,1)加入佇列,並標記(1,1)已經走過。

que[tail].x = 1;

que[tail].y = 1;

que[tail].s = 0;

tail ++;

book[1][1] = 1;

然後從(1,1)開始,先嘗試往右走到達了(1,2)。

tx = que[head].x;

ty = que[head].y+1;

需要判斷(1,2)是否越界。

if(tx < 1 || tx > n || ty < 1 || ty > m)

continue;

再判斷(1,2)是否為障礙物或者已經在路徑中。

if(a[tx][ty] == 0 &&book[tx][ty] == 0)

如果滿足上面的條件,則將(1,2)入隊,並標記該點已經走過。

//把這個點標記已經走過

book[tx][ty] = 1;

//注意廣搜每個點通常情況下只入隊一次,和深搜不同,不需要將book陣列還原

//插入新的點到佇列中

que[tail].x = tx;

que[tail].y = ty;

que[tail].s = que[head].s + 1;

tail ++;

接下來還要繼續嘗試往其他方向走。我們發現從(1,1)還可以到達(2,1),因此也需要將(2,1)也加入佇列,**實現和剛才對(1,2)的操作時一樣的。

對(1,1)擴充套件完畢後,其實(1,1)現在對我們來說已經沒有用了,此時我們將(1,1)出隊。出隊的操作就簡單的一句話

head ++;
接下來我們需要在剛才新擴充套件出來的(1,2)和(2,1)兩個點的基礎上繼續向下探索。直至走到小哈的位置,演算法結束。為了方便向四個方向擴充套件,這裡需要乙個next陣列。

int next[4][2] = ,//向右走 

,//向下走

,//向左走

};//向上走

完整**

#includestruct note

;int main()

,book[51][51] = ;

int next[4][2] = ,,,

};int head,tail;

int i,j,k,n,m,startx,starty,p,q,tx,ty,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;

tail ++;

book[startx][starty] = 1;

flag = 0;//用來標記是否到達目標點

//當佇列不為空的時候迴圈

while(head < tail)

if(tx == p &&ty == q)

}if(flag == 1)

break;

head ++;

} printf("%d\n",que[tail-1].s);

return 0;

}

搜尋 廣度優先搜尋

廣度優先搜尋一層一層地進行遍歷,每層遍歷都是以上一層遍歷的結果作為起點,遍歷乙個距離能訪問到的所有節點。需要注意的是,遍歷過的節點不能再次被遍歷。class solution,int shortestpathbinarymatrix vectorint grid length return 1 cl...

廣度優先搜尋

include include include include using namespace std struct node 圖頂點結構定義 typedef struct node graph 圖形的結構新型態 struct node head 9 圖形頂點陣列 int visited 9 遍歷標...

廣度優先搜尋

廣度優先搜尋詳解 1.也稱寬度優先搜尋,顧名思義,就是將一棵樹一層一層往下搜。演算法首先搜尋和s距離為k的所有頂點,然後再去搜尋和s距離為k l的其他頂點。bfs是一種完備策略,即只要問題有解,它就一定可以找到解。並且,廣度優先搜尋找到的解,還一定是路徑最短的解。但是它盲目性較大,尤其是當目標節點距...