UVA 11624 fire! (bfs)
bfs簡單題,和最簡單粗暴的迷宮題就差了一個人走的同時火在蔓延。咱的實現是在同一時間內先廣搜火的路徑再廣搜人的路徑。
分析的話,也可以分開,先對火單獨做一次bfs,把所有的可走路徑上火最快到達的時間求出來,然後人走bfs的時候再與人走到此格的時間和火燒到此點的時間進行對比,實現起來更清晰一些。
PS:然而看錯題以為著火點只有一個。貢獻了那麼多次wa我這也是沒誰了。引以為戒……以後一定要好好讀題Orz
#include <iostream>
#include <string>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <ctime>
#include <cmath>
#include <queue>
#include <map>
#define M 1005
#define INF 0x3f3f3f3f
using namespace std;
struct node
{
int x, y, step;
}F[M * M],st;
int cnt, cnt1, R, C, f[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
char maze[M][M];
bool vis[M][M], visfire[M][M];
int bfs()
{
node fires, tmp, t;
memset(vis, false, sizeof(vis));
memset(visfire, false, sizeof(visfire));
queue<node> Q, fire;
Q.push(st);
for(int i = 0; i < cnt; i++)
{
fire.push(F[i]);
visfire[F[i].x][F[i].y] = true;
}
cnt1 = 1 ;
vis[st.x][st.y] = true;
while(cnt1)//在這裡等同於while(!Q.empty())
{
while(cnt--)//添加當前時間點火蔓延到的地點
{
fires = fire.front();
fire.pop();
for(int i = 0; i < 4; i++)
{
t.x = fires.x + f[i][0];
t.y = fires.y + f[i][1];
if(!visfire[t.x][t.y] && maze[t.x][t.y] != '#' && t.x > 0 && t.y > 0 && t.x <= R && t.y <= C)
{
visfire[t.x][t.y] = true;
fire.push(t);
}
}
}
cnt = fire.size();
while(cnt1--)//當前時間點火蔓延到的地點求完後,再求當前人可以走的所有路徑
{
tmp = Q.front();
Q.pop();
for(int i = 0; i < 4; i++)
{
t.x = tmp.x + f[i][0];
t.y = tmp.y + f[i][1];
t.step = tmp.step + 1;
if(t.x <= 0 || t.y <= 0 || t.x > R || t.y > C)//一旦走到迷宮外就返回時間值
{
return t.step;
}
if(!vis[t.x][t.y] && !visfire[t.x][t.y] && maze[t.x][t.y] != '#')
{
vis[t.x][t.y] = true;
Q.push(t);
}
}
}
cnt1 = Q.size();
}
return -1;
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%d %d", &R, &C);
int i, j;
cnt = 0;
for(i = 1; i <= R; i++)
{
scanf("%s", maze[i] + 1);
for(j = 1; j <= C; j++)
{
if(maze[i][j] == 'J')
{
st.x = i;
st.y = j;
}
else if(maze[i][j] == 'F')
{
F[cnt].x = i;
F[cnt++].y = j;
}
}
}
int ans = bfs();
if(ans != -1)
printf("%d\n", ans);
else
printf("IMPOSSIBLE\n");
}
return 0;
}
執行結果:
相關推薦
UVA 11624 fire! (bfs)
bfs簡單題,和最簡單粗暴的迷宮題就差了一個人走的同時火在蔓延。咱的實現是在同一時間內先廣搜火的路徑再廣搜人的路徑。 分析的話,也可以分開,先對火單獨做一次bfs,把所有的可走路徑上火最快到達的時間求出來,然後人走bfs的時候再與人走到此格的時間和火燒到此
UVA 11624 Fire!【兩點BFS】
ring help eth oca oid 全部 push_back 逃離 pre Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the owner of
UVA - 11624 Fire!(雙層BFS)
傳送門 題目大意就是給1個n*m的網格,上面有的點能走,有的點不能走(牆),然後有的點是火源,火源和人一樣,每次都是上下左右四個方向蔓延,速度一樣是1,火也不可以從牆上跨過去,給你人的起點,終點是隻要走到邊界就行,就是走出矩陣,問你最小逃生時間。 這個題算是基本的廣搜題吧!我們想下他跟我們見
UVA 11624 Fire! 【bfs】
Joe works in a maze. Unfortunately,portions of the maze have caught on fire, and the owner of the maze neglectedto create a fire escape pl
UVA 11624 Fire!(BFS)
題意:J需要逃出矩陣,只有走到矩陣邊即算成功。但是矩陣中存在幾個F代表火,火每一秒向四周擴散,問J能否逃出?求最短路徑。 思路一:先對火進行搜尋,記錄火到每個點的最短時間。然後對J進行搜尋,J每次到一個點,判斷J到這個點的時間是否早於火到達的時間。若早即可
UVA 11624 Fire! (技巧BFS)
題意:一個地圖中有空地有牆,空地可以走。地圖中有兩中物品,一種是人,每分鐘可以上下左右任走一格,一種是火,每分鐘會向上下左右一起擴散。問人是否可以逃脫迷宮。逃脫迷宮的條件是到達邊緣。 題解:我的思路比較奇特,我把火和人放在一個佇列中處理了。這種處理方式是先處理火,然後再處理
【POJ3126 Prime Path】【POJ 3087 Shuffle'm Up】【UVA 11624 Fire!】【POJ 3984 迷宮問題】
POJ3126Prime Path 給定兩個四位素數a b,要求把a變換到b 變換的過程要 每次變換出來的數都是一個 四位素數,而且當前這步的變換所得的素數 與 前一步得到的素數 只能有一個位不同,而且每步得到的素數都不能重複。
uva 11624 Fire!
先bfs火,儲存火的位置及時間的關係,放入佇列,再bfs人 #include<stdio.h> #include<iostream> #include<algorithm> #include<string> #
UVA 11624 (BFS)
題目:一個平面迷宮中有一個人,迷宮中有些點起火了,火和人每個單位時間只能向相鄰的格子移動, 其中有一些空間被牆壁佔據,問這個人在不背或燒到的情況下,離開迷宮的最快時間。 分析:搜尋。迷宮中的最短路,首先就會想到bfs;並且bfs利用佇列會使狀態空間按時
11624 Fire! bfs
題目連結 題意:有一個迷宮,迷宮裡有多個火堆和一個人,每一分鐘人可以移動一個單元格,同時每堆火焰可以同時向上下左右四個方向移動,每分鐘火堆先移動,且人不能移動到有火堆的單元格,求人能否逃離迷宮且若能逃離則最短用時是多少。 思路:典型的bfs,由於火堆和人都要擴充套件,且火
uva 11624 大火蔓延的迷宮 Fire!(兩次bfs)
題目:一個平面迷宮中有一個人,迷宮中有些點起火了,火和人每個單位時間只能向相鄰的格子移動, 其中有一些空間被牆壁佔據,問這個人在不背或燒到的情況下,離開迷宮的最快時間。 思路是先用bfs預處理每個格子起火的時間,在來一次bfs走迷宮,入隊時判斷
# Fire! UVA - 11624
這題剛開始寫的時候,人走迷宮的時候,沒有用visit陣列,導致 t 了。 然後沒有注意到題目中的 portions ,意思是火苗可能有多個起點,人只能有一個起點。 最後分析一下bfs 和 dfs 的時間複雜度: 鄰接矩陣 MxN (每個點最多訪問一次
bfs 逃出火源(UVA 11624)
你的任務是幫助Joe走出一個大火蔓延的迷宮。Joe每分鐘可以走到上下左右4個方向的相鄰格之一,而所有著火的格子都會往四周蔓延(即如果某個空格與著火格有公共邊,則下一分鐘這個空格將著火)。迷宮中有一些障礙格,Joe和火都無法進入。當Joe走到一個迷宮的邊界格子時,我們認為他已經出了迷宮。求他走出迷宮的
UVA 11624 兩次bfs 疑惑
要求:n*m的迷宮內,#表示不可以通過的牆,.表示可走的路,J表示逃離迷宮的人,F表示火,人每分鐘可以移動一格,火每分鐘向四個方向擴充套件一格。有一個J和多個F。問人是否可以逃出迷宮,逃出邊界即算作逃出迷宮。若可以輸出逃出的最短時間,不可以則輸出IMPOSSIBLE。 方法:2次bfs 1.
UVA 11624
oss flag ++ using ring sin == nod ret 可能有多個著火點。 進行兩次bfs。先將著火點預處理,記錄地圖中每個點被燃燒的最短時間,再讓J開始走,每一步走的時間必須小於該點被燃燒的最短時間。 1 #include <iostrea
Uva 816 Abbott的復仇(三元組BFS + 路徑還原)
tor init false ace names strlen truct pos int 題意: 有一個最多9*9個點的迷宮, 給定起點坐標(r0,c0)和終點坐標(rf,cf), 求出最短路徑並輸出。 分析: 因為多了朝向這個元素, 所以我們bfs的隊列元素就是一個三
UVa 1599 理想路徑(反向BFS 求最短路徑 )
ack pan clu inf struct name esp turn pop 題意: 給定一個有重邊有自環的無向圖,n個點(2 <= n <= 100000), m條邊(1 <= m <= 200000), 每條邊有一個權值, 求從第一個點到n的
Fire! 又是圖 bfs
== set while temp eth borde space wal eterm Joe works in a maze. Unfortunately, portions of the maze havecaught on re, and the owner of
FZU 2150 Fire Game (高姿勢bfs--兩個起點)
con 暴力 roc 大於 efi while 否則 back sample Description Fat brother and Maze are playing a kind of special (hentai) game on an N*M boar
UVA - 10410 Tree Reconstruction (根據dfs序和bfs序恢復一顆樹)
bsp int clu pan n) printf pri 完全 scanf 題意: 分析: 這題一開始完全沒有思路, 一直沒有找出規律。 參考了http://www.cnblogs.com/Wade-/p/6358859.html 和 http://www.cnblog