I Fire(多個bfs搜尋)

2021-10-08 12:26:51 字數 1990 閱讀 1649

題意:joe被困在迷宮中,可以從邊界逃出,但迷宮中有火,火和joe同時移動,問joe能否逃出迷宮。

解題思路:

該題看起來很困難,因為我們可能會想到兩個bfs搜尋同時進行,

如果這樣就不知道從何處理了。因為這相當於兩條盲驢亂撞,很難求出結果。

那麼,我們是否可以先進行乙個再進行另乙個呢?

顯然是可以的,因為我們關鍵是要讓joe逃出迷宮,如果我是預言家,我先前就知道了火到達迷宮中各個點的時間,那麼火和joe同時燒,joe不就可以根據火等等種種因素來判斷行徑嗎?

所以,我們可以設定乙個二維陣列儲存每個點火燒到的時間,當然,對於無法燒到的點我們設定其時間為無窮大

int times[maxn][maxn];

那麼,通過對火bfs搜尋記錄每個點火燒到的時間,再通過這個去判斷joe能不能被火燒到,即joe走到某點的時間如果小於times[x][y]那麼說明不會被燒到。ok,以此對joe進行一趟bfs搜尋。則易解。

ps:一定一定要清空佇列,一定一定要初始化陣列,還有最重要的一點:火種不只是只有乙個,可能有多個火種,即我們要進行多源點bfs搜尋。

ac**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn=

1002

;//迷宮的最大尺寸。

const

int inf=

0x3f3f3f3f

;//表示無窮大

char maze[maxn]

[maxn]

;//迷宮

bool visited[maxn]

[maxn]

;int go[4]

[2]=

,,,}

;//代表操作行為。

int t,r,c;

//t組測試用例,迷宮大小為r*c;

typedef

struct nodenode;

int times[maxn]

[maxn]

;//火燃燒到該點所需要消耗的時間。

queue q1;

node fire,temp;

bool

check_fire

(int x,

int y)

intbfs_fire()

}}return0;

}bool

check_joe

(node temp)

intbfs_joe

(node joe)

for(

int i=

0;i<

4;i++)}

}printf

("impossible\n");

return0;

}int

main()

else

if(maze[i]

[j]==

'f')}}

bfs_fire()

;memset

(visited,

false

,sizeof

(visited));

//重置輔助陣列,供joe判斷。

bfs_joe

(joe);}

}return0;

}

廣度搜尋bfs

廣度搜尋在acm中應用十分廣泛,英文簡寫是bfs breadth first search 下面先看一下例子 在乙個4 4的矩形中,有一些位置設定有障礙,要求從 1,1 走到 4,4 求最短距離。分析 假設沒有任何障礙,我們可以走的路線如下 起點為 1,1 假設這一步是第一步可以到達的位置 然後它可...

寬度優先搜尋BFS

寬度優先搜尋 bfs,breadth first search 也是搜尋的手段之一。它與深度優先搜尋類似,從某個狀態出發探索所有可以到達的狀態。與深度優先搜尋的不同之處在於搜尋的順序,寬度優先搜尋總是先搜尋距離初始狀態近的狀態。也就是說,它是按照開始狀態 只需1次轉移就可以到達的所有狀態 只需2次轉...

BFS廣度優先搜尋

廣度優先搜尋,利用佇列實現,結束標誌是隊列為空的時候 承接dfs的演算法實現的講例,對於迷宮問題我們也可以採取廣度優先搜尋實現 include iostream include cstdio include cstdlib using namespace std int map 55 55 int ...