廣度優先搜尋演算法:先查詢離起始頂點最近的,然後是第二進的,這樣依次往外搜尋。樹的層次遍歷就是乙個廣度搜尋演算法。
一般需要用到佇列這個資料結構,但是如果你是c語言開發,並且是在考試中,時間有限。一般臨時寫乙個佇列出來還是很耗時間的,所以一般用乙個大陣列來模擬佇列。
今天做了兩道力扣題目,總結一下bfs的套路:
第一題: 542. 01 矩陣
c**實現:
1view code/*廣度優先: 用大陣列實現佇列 */2
#define max_size 10000
3int numsquares(intn)4
;6int front = 0; //隊首7
int rear = 0; //隊尾8
int size = 0; //
當前佇列中元素的個數
9int visit[max_size] = ; //
visit[i]表示元素i是否已經訪問過
1011
//初始化佇列
12 queue[0] =n;
13 rear++;
14 visit[n] = 1;15
int result = 0;16
while (front < rear)
27//
入佇列28
if (visit[nextelem] != 1
) 32}33
}34}35
return
result;
36 }
第二題:490. 迷宮
c**實現:
1 typedef structview codetagpos pos;56
bool haspath(int** maze, int mazesize, int* mazecolsize, int* start, int startsize, int* destination, int
destinationsize)14}
15int max_size = rowsize *colsize;
16pos queue[max_size];
17int front = 0;18
int rear = 0;19
//int size;
20 queue[0].rowindex = start[0
];21 queue[0].colindex = start[1
];22 rear++;
23 visit[start[0]][start[1]] = 1;24
int direct[4][2] = , , , };
25while (front
31for (int i = 0; i < 4; i++)
39/*
走到這裡x, y如果是有效的。那麼maze[x][y]一定為 1
40* 所以需要按照原來的方向退一格。所以是:
41* x -= direct[i][0] y -= direct[i][1];
42* 然後再判斷移位之後x,y 的情況
43*/
44 x -= direct[i][0
];45 y -= direct[i][1
];46
if (x >= 0 && x < rowsize && y >= 0 && y < colsize && visit[x][y] != 1
) 53}54
}55return
false
;56 }
總結:經過上面兩道題,看到別人總結了bfs的套路,現摘抄如下:
bfs 使用佇列,把每個還沒有搜尋到的點依次放入佇列,然後再彈出佇列的頭部元素當做當前遍歷點。bfs 總共有兩個模板:
1、如果不需要確定當前遍歷到了哪一層,bfs 模板如下。
1view codewhile
queue 不空:
2 cur =queue.pop()
3for 節點 in
cur的所有相鄰節點:4if
該節點有效且未訪問過:
5 queue.push(該節點)
2、如果要確定當前遍歷到了哪一層,bfs 模板如下。
這裡增加了 level 表示當前遍歷到二叉樹中的哪一層了,也可以理解為在乙個圖中,現在已經走了多少步了。size 表示在當前遍歷層有多少個元素,也就是佇列中的元素數,我們把這些元素一次性遍歷完,即把當前層的所有元素都向外走了一步。
1 level = 0view code2while
queue 不空:
3 size =queue.size()
4while (size --)
10 level ++;
資料結構與演算法 搜尋 一 廣度優先搜尋
首先需要說明,這裡所說的廣度優先搜尋,與利用廣度優先搜尋對圖進行遍歷有一定的差別。廣度優先搜尋確實可以以被應用在圖的遍歷當中,但其應用遠不僅如此。我們通過乙個例題,引出廣度優先搜尋 例 勝利大逃亡 題目描述 ignatius被魔王抓走了,有一天魔王出差去了,這可是ignatius逃亡的好機會,魔王住...
資料結構 廣度優先搜尋
實驗任務 眾所周知,索隆是乙個路痴,一天在一小島上,他又迷路了!好 山治心急如焚,決定出去找他,由於練成了月步,山治的速度竟然達到了正無窮!小島上除了空地,還有盤 絲洞 簡稱 psd 盤絲洞裡住著可愛的妹紙,山治每次經過乙個盤絲洞,都要停留乙個單 位時間來欣賞妹紙,給你乙個 n m 的地圖以及山治和...
廣度優先搜尋 資料結構
廣度優先搜尋 bfs 的乙個常見應用是找出從根結點到目標結點的最短路徑。結點的處理順序是越是接近根結點的結點將越早地遍歷。佇列的入隊和出隊順序是新新增的節點不會立即遍歷,而是在下一輪中處理。結點的處理順序與它們新增到佇列的順序是完全相同的順序,即先進先出 fifo 這就是我們在 bfs 中使用佇列的...