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...