走迷宫-双向bfs解法
生活随笔
收集整理的這篇文章主要介紹了
走迷宫-双向bfs解法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
用一張圖來進行說明
當兩種顏色相遇的時候,說明兩個方向的搜索樹遇到一起,這個時候就搜到了答案。
例題1:走迷宮
問題描述:
一個迷宮由 R R R行 C C C列格子組成,有的格子里有障礙物,不能走;有的格子是空地,可以走。
給定一個迷宮,求從左上角走到右下角最少需要走多少步(數據保證一定能走到)。只能在水平方向或垂直方向走,不能斜著走。
輸入
第一行是兩個整數, R R R和 C C C,代表迷宮的長和寬。 ( 1 ≤ R , C ≤ 40 ) ( 1≤ R,C ≤ 40) (1≤R,C≤40)
接下來是 R R R行,每行 C C C個字符,代表整個迷宮。
空地格子用‘.’表示,有障礙物的格子用‘#’表示。
迷宮左上角和右下角都是‘.’。
輸出
輸出從左上角走到右下角至少要經過多少步(即至少要經過多少個空地格子)。計算步數要包括起點和終點。
樣例輸入
5 5 ..### #.... #.#.# #.#.# #.#..樣例輸出
9代碼如下:
#include <iostream> #include <queue> using namespace std; int r, c; const int N = 45; char mp[N][N]; typedef pair<int, int>PII; #define x first #define y second int vis[N][N]; int flag; int dis[N][N]; int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};int dbfs() {queue<PII>q1, q2;//q1為從前往后搜,q2為從后往前搜dis[1][1] = 1;dis[r][c] = 1;vis[1][1] = 1;//q1標記為1vis[r][c] = 2;//q2標記為2//如果某狀態下,當前節點和準備擴展節點的狀態相加為3,//說明相遇q1.push({1, 1});q2.push({r, c});PII t;while (q1.size() && q2.size()) {if (q1.size() < q2.size()) {每次擴展搜索樹小的隊列 flag=1表示從前往后搜的隊列,flag=0表示從后往前搜的隊列t = q1.front();q1.pop();flag = 1;//q1標記為1} else {t = q2.front();q2.pop();flag = 0;//q2標記為0}for (int i = 0; i < 4; i++) {int xx = t.x + dx[i];int yy = t.y + dy[i];if (xx >= 1 && xx <= r && yy >= 1 && yy <= c && mp[xx][yy] == '.')if (!dis[xx][yy])if (flag) {vis[xx][yy] = 1;dis[xx][yy] = dis[t.x][t.y] + 1;q1.push({xx, yy});} else {vis[xx][yy] = 2;dis[xx][yy] = dis[t.x][t.y] + 1;q2.push({xx, yy});} else {if (vis[xx][yy] + vis[t.x][t.y] == 3)//相遇 {return dis[xx][yy] + dis[t.x][t.y];}}}}return -1; }int main() {cin >> r >> c;for (int i = 1; i <= r; i++)for (int j = 1; j <= c; j++)cin >> mp[i][j];cout << dbfs() << endl;return 0; }參考文章鏈接:https://blog.csdn.net/weixin_43501684/article/details/90147421
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的走迷宫-双向bfs解法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高尔夫职业运动员吴阿顺 佩戴华为智能金表
- 下一篇: 八数码问题II-bfs和map标记