bfs學習記錄 模板 思路彙總

2021-10-09 04:58:21 字數 2619 閱讀 5923

hb小鹹魚學習記錄*

小結藍橋杯刷了不少的搜尋題,但是bfs的題很少,大部分都是dfs的題。

但是去年藍橋杯就考了bfs,所以還是得好好刷題。

bfs由於是乙個迴圈進行搜尋,所以沒法回溯,因而每個點位只能被走一次。這樣加快了搜尋速度,但是由於每個點只能走一次導致無法列舉出所有的可走路徑。而這樣的好處是避免了繞遠路,搜尋到結果時一定是最短路。所以大部分的求最短路的題都用bfs.

bfs,字面來看就是以廣度為優先的搜尋方式。搜尋時以原點向四周擴散。如果說dfs是「搜完乙個屋子再搜另乙個屋子」,那bfs就是「把每個屋子的櫃子搜了再搜每個屋子的桌子…」這樣層層深入的搜尋。這樣可以優先搜尋物品可能在的地方,從而減少搜尋的時間。

就像我們規定以「前左右」的順序走迷宮,而在尋找迷宮的出口時就可以看成進行了一次搜尋。我們首先記錄下來第乙個路口能前往哪幾個路口,隨後再按照規定的順序(前左右)檢視這幾個路口的又能前往哪幾個路口。途中前往過的路口要進行標記,防止重複的檢視。直到檢視乙個路口,它可以前往到終點或者它就是終點,此時搜尋結束。我們檢視的輪數就是前往該終點的最小步數。而在搜尋過程中,我們可以使用適當的資料結構來儲存前往終點所經過的路口,這就是最短路徑。

這樣進行搜尋的範圍大,查詢到終點的路徑始終是最短路徑。但缺點是我們沒辦法迭代出所有的可前往終點的路徑。

首先,如上個片段所說,我們首先需要乙個二維陣列,來對迷宮進行標記,標記出可以走的點和障礙(不可以走的點)。

其次,我們建立乙個佇列,把起點加入到佇列中。

接著,我們建立乙個while迴圈,設定在佇列不為空的時候執行迴圈。

迴圈中,我們首先獲取佇列的頭結點座標,隨後我們需要對移動的規則進行規定。例如上文的例子規定的「上左右」,我們可以用乙個二維陣列來儲存移動後坐標的變化:

int direction[4]

[2]=

,,,}

;

這個陣列裡面的四組資料就分別代表「上左右下」,在對座標變換時進行

int x1=x+direction[a][0

];int y1=y+direction[a][1

];

即可實現對座標的變化。我們按照這個順序,對頭結點的周圍進行判斷,如果可以前往的話,就將變換後的資料點加入佇列。然後將新點(x1,y1)的狀態進行更改,代表你已經來過這裡了。防止重複的搜尋。

最後,我們需要設定上一步迴圈的中止條件,從而在找到出口時停止或者返回一些資訊。我們常常在迴圈中獲取頭結點後進行判定,如果頭結點資料是我們想要搜尋到的資訊,我們就中止迴圈。

void

bfs(傳入的資料)

top.

pop();

//將隊首元素出隊;

for(按順序尋找top的所有子節點)

樣例輸入input sample 1:

3 3001

100110

樣例輸出

output sample 1:

4rdrd

題目鏈結

這一題算是bfs的經典例題,題目不止讓求了最短的步數,還讓輸出了最短的路徑。

所以我們在佇列結點的資料結構中新增了乙個string字串,用來儲存到達某個點的最短路徑。

在找到終點時,輸出最短步數和最短路徑即可。

ac**:

#include

using

namespace std;

struct data //佇列裡的資料結構 };

queuedatas;

//佇列用來存放點位資料

bool maps[

501]

[501];

//存放迷宮地圖的點位 false代表可前往 true代表不可前往

char fx=

;//方向ascii碼從小到大排列

int site[4]

[2]=

,,,}

;//下 左 右 上的座標變化

void

bfs(

int n,

int m)

//傳參為迷宮的大小 n為寬 m為長

for(

int temp=

0;temp<

4;temp++

)//開始查詢該點的四周點位 (因為只有上下左右4個走法 所以循4次 }}

intmain()

getchar()

;}bfs(x,y)

;//bfs 迷宮長寬 與 xy座標是相反的 所以傳反著的座標

return0;

}

在使用bfs中,要根據題目資料選擇合適的資料型別。bfs的題中往往不會只讓你輸出最短路徑的長度,一般還會帶點別的東西,所以要建立合適的結構來儲存資料。

bfs的常用環境

0 1BFS 學習記錄

0 1bfs用來解決 邊權值為0或1,或者能夠轉化為這種邊權值的最短路問題,時間複雜度為o e v 0 1bfs,從佇列front中去除點u,遍歷u的所有邊,如果當前邊可以進行relax操作,則relax,然後判斷level,若level相同,放到佇列的front,否則,放到back,佇列採用雙端佇...

Docker學習記錄 問題彙總

一 docker port is already allocated 的解決方案 ps aux grep v grep grep docker proxy 第二列為程序號 停止 doker 程序,刪除所有容器,然後刪除 local kv.db 這個檔案,再啟動 docker 就可以了。sudo se...

go學習資源彙總記錄

說明 這篇彙總上手golang語言的一些較好的資源,備查 go語言的設計與實現 learn go in y minutes 乙個例子速覽go語言基本語法內容 go by example 花一天左右時間把這兒的例子全敲一遍,就可以開始用go寫程式啦 go 語言設計與實現 更全面深入的學習,看這個 go...