uva題目鏈結
vj題目銜接
題目大意:火每次四個方向延伸,問人能否跑出這個迷宮,也就是人能走的格仔必須在火延伸到那裡之前。
注意:fire火堆並不是只有乙個,可以有多個fire。但j只有乙個。
思路:廣搜每個f,初始化time陣列,也就是為後面j是否可以走到這個格仔上做準備(也就是stemp[x][y]本來用純粹的從每個f進行bfs,發現超時的,這也是必然的,畢竟rc是1000;然後看其他人寫的,可以不用for從每個f廣搜,直接把每個f放進隊裡就可以了。因為是佇列,所以f先延伸到的點,一定會使time陣列最小,**就不放了。
tle**:
#include
using
namespace std;
typedef
long
long ll;
#define me(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
const
int n=
2111122
;const
int m=
20005
;const
int h =
1005
;char s[h]
[h];
int v[h]
[h],stemp[h]
[h],time[h]
[h];
int f1[4]
=;int f2[4]
=;int r,c;
struct node
;queue q;
void
fire_bfs
(int x,
int y)}}
}}intpeople_bfs
(int x,
int y)
for(i =
0; i <
4; i ++)}
}}}if
(!flag)
return-1
;else
return minn;
}int
main
(void)if
(s[i]
[j]==
'f')
fire_bfs
(i,j);}
}int ans =
people_bfs
(fx,fy);if
(ans ==-1
)printf
("impossible\n");
else
printf
("%d\n"
,ans+1)
;/*for(i = 0;i < r ; i ++) */
}}
ac**:
#include
using
namespace std;
typedef
long
long ll;
#define me(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
const
int n=
2111122
;const
int m=
20005
;const
int h =
1005
;char s[h]
[h];
int v[h]
[h],stemp[h]
[h],time[h]
[h];
int f1[4]
=;int f2[4]
=;int r,c;
struct node
;queue q;
void
fire_bfs()
}}while
(!q.
empty()
)}}}
}int
people_bfs
(int x,
int y)
for(i =
0; i <
4; i ++)}
}}}if
(!flag)
return-1
;else
return minn;
}int
main
(void)}
}fire_bfs()
;int ans =
people_bfs
(fx,fy);if
(ans ==-1
)printf
("impossible\n");
else
printf
("%d\n"
,ans+1)
;/*for(i = 0;i < r ; i ++) */
}}
bfs 大火蔓延的迷宮,UVA 11624
一開始wa了,因為以為只有乙個火源,其實有多個 portions 真的需要加強英語閱讀能力了。解法 這就是乙個加了一些限制條件的迷宮問題,限制條件是迷宮會著火,隨著時間的推移火會蔓延,仔細思考就會發現每個格仔著火的時間是固定而且有跡可循的,如果能預處理出每個格仔著火的時間,那麼問題就已經解決了 只需...
UVa 11624 大火蔓延的迷宮
題意 有乙個大火蔓延的迷宮,迷宮中有障礙格,而所有著火的格仔都會往四周蔓延。求出到達邊界格仔時的最短時間。思路 複雜了一點的迷宮。在bfs之前,我們首先需要計算出火勢蔓延的情況,火勢每次向四周蔓延乙個格仔,所以這也是乙個最短路問題,也用一次bfs,計算出每個空白格仔著火時的時間。這樣,當我們第二次b...
5 14每日鮮例題(一)UVA 11624 BFS
乙個稍微複雜一點的搜尋 首先預處理每個格仔 的時間,j進行轉移的時候加上下乙個格仔在下一時刻是否會著火或是否已經著火的判斷即可 includeusing namespace std const int maxn 1005 char e maxn maxn int t maxn maxn bool b...