4 2 bfs 廣度優先搜尋

2022-09-07 00:15:32 字數 2545 閱讀 3669

深度優先演算法的兄弟,包含另外一種搜尋思維

也叫寬度優先演算法

與深度優先演算法不同,廣度優先演算法注重於"對所有情況的分析搜尋"

如果是深度優先演算法是刨根問底地分析每種情況,

廣度優先就是在在層層擴充套件中找到題解

還是之前的問題,我們想在n*m的迷宮中找到起點到終點的最短路徑

我們的核心思想是分析擴充套件時每發現乙個點,就將這個點加入到佇列中,直到到達終點

另外,為防止乙個點被多次走到,我們還要乙個陣列來記錄乙個點是否被走到

我們決定使用乙個佇列來模擬搜尋過程,我們需要:

1.兩個引數x,y代表點座標

2.乙個引數s代表我們走過的步數

3.某一點之前的,用於計算路徑 (本題不需要計算路徑,就省去這部分)

實現如下:

struct note ;
我們設定相關資料完成佇列,並且對各個條件進行初始化

struct node que[2501] ; //地圖為50*50,設定為2501就不會越界了

int head,tail ;

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

int book[51][51] = ; //記錄拿一些點已經在佇列中了,防止點的重複擴充套件

//0代表還沒走過

//設定佇列

head = 1 ;

tail = 1 ;

//先將預設起點(1,1)加入

que[tail].x = 1 ;

que[tail].y = 1 ;

que[tail].s = 0 ;

tail++;

book[1][1] = 1 ;

我們以(1,1) -> (1,2)為例解釋怎麼進行點的判斷

1.嘗試走到(1,2)

tx = que[head].x + 0; 

ty = que[head].y + 1;

2.判斷

主要是兩點,一是是否越界,二是是否為障礙,三是是否已經走過

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

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

if(a[tx][ty] == 0 && book[tx][ty] == 0 )
我們再用相同的做法判斷(2,1),至此我們已經搜尋了(1,1)周圍的所有點

現在我們需要更新(1,1),這個點已經沒用了,我們將它出隊

head++;
之後,我們新的出發點就變成了(1,2),對它進行搜尋,然後再更新,再搜尋...直到到達終點

另外,這裡的按四個方向搜尋的辦法和深度是一樣的

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<=m;i++)

for(j=1;j<=m;j++)

scanf("%d",&a[i][j]);

scanf("%d %d %d %d",&startx,,&starty,&p,&q);

//初始化佇列

head = 1 ;

tali = 1 ;

//往佇列插入迷宮入口座標

que[tail].x = startx ;

que[tail].y = statty ;

que[tail].f = 0 ;

que[tail].s = 0 ;

tail++;

book[startx][starty] = 1 ;

flag = 0 ; //0表示還沒到達,1表示到達終點

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

//為什麼是「不為空」時執行,請看後面的**

while(head < tail)

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

}if(flag ==1)

break ;

head++ ; //乙個點拓展結束後,對後面的點再拓展

}//列印步數

//值得注意的是,tail是指向「最後乙個位置的下乙個位置」,因此我們要-1

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

getchar();getchar();

return 0 ;

}

BFS廣度優先搜尋

廣度優先搜尋,利用佇列實現,結束標誌是隊列為空的時候 承接dfs的演算法實現的講例,對於迷宮問題我們也可以採取廣度優先搜尋實現 include iostream include cstdio include cstdlib using namespace std int map 55 55 int ...

bfs廣度優先搜尋

這一課我們來學習圖的另一種遍歷方法 廣度優先搜尋 breadth first search,簡稱 bfs 這是一種連通圖的常用遍歷策略,通常用於求起點到各點的最短路徑,以及求兩點之間的最優路徑等問題。首先我們先來看看廣度優先搜尋的具體方法吧 對於乙個連通圖,我們假設一開始所有頂點均未被訪問,廣度優先...

廣度優先搜尋bfs

bfs即廣度優先搜尋演算法,其是搜尋演算法中的一種。1.dfs常用於尋找是否存在解 其從a節點出發,選取乙個臨近點b,然後不斷深入,在搜尋完b的下屬節點 ehif 後,回到a再搜尋臨近a的c節點,以此類推。2.bfs則用於在最短的時間或最少的移動距離內找到解 其往往從a節點出發,搜尋周圍所有的圍繞節...