廣度優先搜尋bfs
廣度優先搜尋(以下簡稱bfs)是搜尋技術中常用的一種搜尋。
bfs體現在廣度一詞上,一層一層進行遍歷,常見的有在矩陣(二維陣列)上的遍歷以及樹和圖的遍歷。體現在二維陣列的遍歷順序如下(假設起點在左上),在只能上下左右四個方向遍歷時,序號代表同一等級的遍歷順序。12
3423
4534
5645
67序號相同的位置訪問順序可任意。實現時,當訪問1號位置時,就要對兩個2號位置進行標記(我要準備訪問你了),當訪問任乙個2號位置時就要標記它能訪問到的3號位置,依次類推。
實現:對於一層一層遍歷的結構,我們使用佇列queue這一先進先出的資料結構。
首先1入隊,遍歷與1相鄰的位置,即兩個2入隊,然後1出隊,然後遍歷與隊尾2相鄰的位置,將其入隊(此時還有乙個2號位置沒遍歷,但是不用擔心,剛入隊的3號位置在隊首,不會影響層層遍歷的光系),隊尾2出隊,此時隊尾仍然是2號位置,此時訪問該2號位置,將與其相鄰且沒遍歷過位置入隊,此時所有的3號位置全部入隊,然後該2號位置出隊。依此遍歷至最後。
對於樹結構的遍歷其實就是對樹結構的層序遍歷,由上往下一層一層進行遍歷。
黑色字型代表結點序號,紅色字型為遍歷層序。
首先遍歷根結點,然後還是兩個2號根結點的葉子結點入隊遍歷方式與矩陣相似。
圖結構的遍歷也類似
例題://模板
int v[max]
[max]
;//標記陣列,標記某位置是否已經訪問
int dx[4]
=;int dy[4]
=;struct a
root,top;
//結構體表示每乙個位置
void
bfs(
int x,
int y)
//x,y傳入起始位置座標if(
!v[nx]
[ny]
)//未被訪問,入隊等待訪問}}
}
力扣1293:
網格中的最短路徑
原題鏈結
思考:
思路自然是深搜,值得注意的是如果v陣列跟平常一樣只設定二維,可能從一條路徑經過i,j這個點出不去,而此時v[i][j]被標記為訪問過,可能正確***含的路徑卻偏偏包含i,j這個點,這就無法得到正確答案咯;這時我們可以開乙個三維v陣列,表示每次經過該點時經過的障礙點的次數。
ac**:
多個原始點的搜尋:class
solution
root,top;
int n,m,k;
int ans=
10000
;int dx[4]
=;int dy[4]
=;int a[
100]
[100];
bool v[50]
[50][
1600];
void
bfs()if
(!v[nx]
[ny]
[top.k])}
}}intshortestpath
(vector
int>>
& grid,
int k)
};
洛谷p1332
軍團是乙個n 行m 列的矩陣,每個單元是乙個血色先鋒軍的成員。感染瘟疫的人,每過乙個小時,就會向四周擴散瘟疫,直
到所有人全部感染上瘟疫。你已經掌握了感染源的位置,任務是算出血色先鋒軍的領主們感染瘟疫的時間,並且將它報告給
巫妖王,以便對血色先鋒軍進行一輪有針對性的圍剿.
輸入描述:
第一行:n,m,a,b;表示軍團矩陣有n 行m 列。有 a 個感染源,b 為血色敢死隊中領主的數量。
接下來a行:每行有兩個整數x,y,表示感染源再第x行第y列。
接下來b行:每行兩個整數x,y,表示領主的位置再第x行第y列。
輸出描述:
第1行至第b行:每行乙個整數,表示這個領主感染瘟疫的時間,輸出順序與輸入順序一致。
如果某個人的位置在感染原,那麼他感染瘟疫的時間為0;
#include
using
namespace std;
#define ll long long
const
int max=
5e2+20;
inline
intread()
while
(ch<
'0'||ch>
'9');do
while
(ch>=
'0'&&ch<=
'9')
;return x*f;
}struct a
root,top;
int n,m;
int ans[max]
[max]
;int p[
100000][
3];bool v[max]
[max]
;queueq;
int dx[4]
=;int dy[4]
=;void
bfs()}
}int
main()
for(
int i=
1;i<=b;i++
)bfs()
;for
(int i=
1;i<=b;i++
)return0;
}
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節點出發,搜尋周圍所有的圍繞節...