簡單易懂的BFS

2021-10-08 16:39:32 字數 1456 閱讀 5594

bfs從起點開始,優先搜尋離起點最近的點,然後由這個最近的點擴充套件其他稍近的點,這樣一層一層的擴充套件,就像水波擴散一樣。

bfs需要借助佇列來實現:

初始的時候把起始點放入佇列中,並標記起點訪問

如果佇列不為空,從佇列中取出乙個元素x,否則演算法結束

訪問和x相連的所有點v,如果v沒有被訪問,把v入隊,並標記已經訪問

重複執行步驟2

根據該思路可以得出乙個簡單的**框架:

void bfs(起始點) 

} }隊列為空,廣搜結束;

}

關於前面所提到的迷宮最短路問題,我們已經學會了使用dfs來求解。用dfs求解迷宮最短路有乙個很大的缺點,需要列舉所有可能的路徑,讀入的地圖一旦很大,可能的搜尋方案數量就會非常多,用dfs搜尋顯然效率會非常低。

我們可以借助bfs來求解迷宮遊戲。由於bfs是分層搜尋,因此,第一次搜尋到終點的時候,當前搜尋的層數就是最短路徑的長度

例1:題目: 迷宮遊戲 我們用乙個二維的字元陣列來表示前面畫出的迷宮:

s**. 

....

***t

其中字元s表示起點,字元t表示終點,字元∗表示牆壁,字元.表示平地。你需要從s出發走到t,每次只能向上下左右相鄰的位置移動,不能走出地圖,也不能穿過牆壁,每個點只能通過一次。你需要程式設計來求解出從起點到終點的最短路徑

由於bfs求解要用到佇列,所有我們將點的位置設為乙個結構體,方便佇列存放:

struct node 

};

然後套用上述的bfs框架:

int bfs(int sx, int sy)  else 

}} }

return -1;

}

完整實現:

#include #include #include using namespace std;

int n,m;

string maze[110];

bool vis[110][110];

int dir[4][2] = , , , };

bool in(int x, int y)

struct node

};int bfs(int sx, int sy) else

}} }

return -1;

} int main()

int x, y;

for (int i = 0; i < n; ++i)

} }cout << bfs(x, y);

return 0;

}

input:

5 6

…s*.…

.….*….

.t…

output:

7

簡單易懂BFS

廣度優先搜尋,又稱寬度優先搜尋,簡稱bfs bfsbfsbf sbfs bfs從起點開始,優先搜尋離起點最近的點,然後由這個最近的點擴充套件其他稍近的點,這樣一層一層的擴充套件,就像水波擴散一樣。b fs bfsbf s需要借助佇列來實現 根據該思路可以得出乙個簡單的 框架 void bfs 起始點...

DFS與BFS的原理 簡單易懂 力扣例題

dfs 思想 一直往深處走,直到找到解或者走不下去為止 使用棧儲存未被檢測的結點。結點按照深度優先的次序被訪問並依次被壓入棧中,並以相反的次序出棧進行新的檢測。類似於樹的先根遍歷。例如 走迷宮,你沒有辦法用分身術來站在每個走過的位置,不撞南山不回頭。使用dfs解決問題時最先想到的應該是遞迴和棧 st...

簡單易懂的udp

udp 是一種簡單傳輸協議,實現簡單,占用系統資源少 客戶端服務端 coding utf 8 import time from socket import 建立簡單的udp服務端 建立套接字 soc socket af inet,sock dgram 設定本地位址 local addr 50000 ...