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