1. 程式人生 > >UVA 11624 fire! (bfs)

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 11624BFS

題目:一個平面迷宮中有一個人,迷宮中有些點起火了,火和人每個單位時間只能向相鄰的格子移動,             其中有一些空間被牆壁佔據,問這個人在不背或燒到的情況下,離開迷宮的最快時間。 分析:搜尋。迷宮中的最短路,首先就會想到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