bfs 大火蔓延的迷宮,UVA 11624

2021-07-26 15:58:41 字數 1204 閱讀 3699

一開始wa了,因為以為只有乙個火源,其實有多個(portions)。真的需要加強英語閱讀能力了。

解法:這就是乙個加了一些限制條件的迷宮問題,限制條件是迷宮會著火,隨著時間的推移火會蔓延,仔細思考就會發現每個格仔著火的時間是固定而且有跡可循的,如果能預處理出每個格仔著火的時間,那麼問題就已經解決了(只需要在bfs擴充套件節點時判斷一下即可,如果著火了就當做牆,否則就可以擴充套件)。那麼該怎麼預處理呢?顯然火也是bfs蔓延的,所以對火跑一遍bfs就能得到每個格仔著火時間(如果永不著火就設為inf)。如果有多個火源該怎麼辦呢?難道每個火源跑一遍bfs然後更新?其實在一開始將他們全部放入佇列中,然後跑一遍bfs就可以了。(當然也可以設乙個超級匯點,這個匯點的著火時間為-1,且只與著火點連通)

**#includeusing namespace std;

const int maxn = 1010;

const int inf = 0x3f3f3f3f;

typedef pairpii;

typedef pairppi;

pii j;

vectorf;

int n,m;

char map[maxn][maxn];

int vis[maxn][maxn];

int fire[maxn][maxn];

int dx[4]=;

int dy[4]=;

bool ok(pii p)

bool out(pii p)

void bfs1()

{ memset(fire,inf,sizeof(fire));

queueq;

for(unsigned int i=0;iq;

q.push(make_pair(j,0));

vis[j.first][j.second]=1;

while(!q.empty())

{ppi now=q.front();

q.pop();

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

{ppi to=make_pair(make_pair(now.first.first+dx[i],now.first.second+dy[i]),now.second+1);

if(ok(to.first)&&!vis[to.first.first][to.first.second]&&map[to.first.first][to.first.second]!='#'&&to.second

UVa 11624 大火蔓延的迷宮

題意 有乙個大火蔓延的迷宮,迷宮中有障礙格,而所有著火的格仔都會往四周蔓延。求出到達邊界格仔時的最短時間。思路 複雜了一點的迷宮。在bfs之前,我們首先需要計算出火勢蔓延的情況,火勢每次向四周蔓延乙個格仔,所以這也是乙個最短路問題,也用一次bfs,計算出每個空白格仔著火時的時間。這樣,當我們第二次b...

迷宮問題的雙向BFS

include include include define startvalue 2012 define endvalue 2013 define queuesize 1024 1024 size of the queue for bfs define maxvalue 65535 typedef...

學霸的迷宮 BFS

演算法提高 學霸的迷宮 時間限制 1.0s 記憶體限制 256.0mb 問題描述 學霸搶走了大家的作業,班長為了幫同學們找回作業,決定去找學霸決鬥。但學霸為了不要別人打擾,住在乙個城堡裡,城堡外面是乙個二維的格仔迷宮,要進城堡必須得先通過迷宮。因為班長還有妹子要陪,磨刀不誤砍柴功,他為了節約時間,從...