uva 11624 大火蔓延的迷宮 Fire!(兩次bfs)
題目:一個平面迷宮中有一個人,迷宮中有些點起火了,火和人每個單位時間只能向相鄰的格子移動,
其中有一些空間被牆壁佔據,問這個人在不背或燒到的情況下,離開迷宮的最快時間。
思路是先用bfs預處理每個格子起火的時間,在來一次bfs走迷宮,入隊時判斷著火事件和父節點時間大小關係
程式碼如下:
#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<queue> #include<stack> #include<string> #include<map> #include<set> using namespace std; #define LL long long const int maxr = 1000 + 5; const int maxc = 1000 + 5; const int dirx[] = {-1, 0, 1, 0}; const int diry[] = {0, -1, 0, 1}; const int INF = 100000000; struct node { int x; int y; }; int G[maxr][maxc], fire_time[maxr][maxc], timeuse[maxr][maxc]; //0表示障礙,1表示空地,2表示著火 void bfs(int r, int c) { queue<node> fire; for(int i = 1; i <= r; i++) for(int j = 1; j <= c; j++) { fire_time[i][j] = INF; if(G[i][j] == 2) { fire_time[i][j] = 0; fire.push((node){i, j}); } } while(!fire.empty()) { node f = fire.front(); fire.pop(); for(int i = 0; i < 4; i++) { int nx = f.x + dirx[i], ny = f.y + diry[i]; if(nx > 0 && nx <= r && ny > 0 && ny <= c && G[nx][ny] == 1 && fire_time[nx][ny] == INF) { fire_time[nx][ny] = fire_time[f.x][f.y] + 1; fire.push((node){nx, ny}); } } } } void bfs_mg(int jx, int jy, int r, int c) { for(int i = 1; i <= r; i++) for(int j = 1; j <= c; j++) timeuse[i][j] = INF; queue<node> mg; timeuse[jx][jy] = 0; mg.push((node){jx, jy}); while(!mg.empty()) { node u = mg.front(); mg.pop(); for(int i = 0; i < 4; i++){ int nx = u.x + dirx[i]; int ny = u.y + diry[i]; if(nx > 0 && nx <= r && ny > 0 && ny <= c && G[nx][ny] == 1 && timeuse[nx][ny] == INF && timeuse[u.x][u.y] < fire_time[nx][ny] - 1){ timeuse[nx][ny] = timeuse[u.x][u.y] + 1; mg.push((node){nx, ny}); } } } } void solve(int r, int c){ int ans = INF; for(int i = 1; i <= r; i++) ans = min(ans, timeuse[i][1]); for(int i = 1; i <= r; i++) ans = min(ans, timeuse[i][c]); for(int j = 1; j <= c; j++) ans = min(ans, timeuse[1][j]); for(int j = 1; j <= c; j++) ans = min(ans, timeuse[r][j]); if(ans == INF) printf("IMPOSSIBLE\n"); else printf("%d\n", ans + 1); } int main() { //freopen("input.txt", "r", stdin); int t; scanf("%d", &t); while(t--) { int r, c; scanf("%d%d", &r, &c); int jx, jy; for(int i = 1; i <= r; i++) { getchar(); for(int j = 1; j <= c; j++) { char x; scanf("%c", &x); if(x == '#') G[i][j] = 0; else if(x == '.') G[i][j] = 1; else if(x == 'F') G[i][j] = 2; else {G[i][j] = 0; jx = i; jy = j;} } } bfs(r, c); bfs_mg(jx, jy, r, c); solve(r, c); //for(int i = 1; i <= r; i++) // for(int j = 1; j <= c; j++) printf("%d ", fire_time[i][j]); //for(int i = 1; i <= r; i++) // for(int j = 1; j <= c; j++) printf("%d ", time[i][j]); //for(int i = 1; i <= r; i++) // for(int j = 1; j <= c; j++) printf("%d ", G[i][j]); } return 0; }
相關推薦
uva 11624 大火蔓延的迷宮 Fire!(兩次bfs)
題目:一個平面迷宮中有一個人,迷宮中有些點起火了,火和人每個單位時間只能向相鄰的格子移動, 其中有一些空間被牆壁佔據,問這個人在不背或燒到的情況下,離開迷宮的最快時間。 思路是先用bfs預處理每個格子起火的時間,在來一次bfs走迷宮,入隊時判斷
【FZU2150】Fire Game(兩起點bfs)
題目連結 Problem 2150 Fire Game Accept: 3827 Submit: 13039 Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description Fat
UVA11624 Fire! (兩次BFS) 讀懂題意很重要
題目:https://uva.onlinejudge.org/index.phpoption=com_onlinejudge&Itemid=8&page=show_problem&problem=2671題意:就是迷宮著火了,火勢會蔓延,Joe要逃跑,
UVA11624 Fire!(兩次bfs,第一次預處理)
題意翻譯 大火蔓延的迷宮 題目大意 你的任務是幫助Joe走出一個大火蔓延的迷宮。Joe每分鐘可以走到上下左右4個方向的相鄰格子之一,而所有著火的格子都會四周蔓延(即如果某個空格子與著火格子有公共邊,則下一分鐘這個空格子將著火)。迷宮中有一些障礙格,Joe和火都無法進入。當Joe走到一個迷宮的
PAT (Basic Level) Practice 1003 我要通過!(兩種解法)
乙級1003 這題和HOJ3788一樣,故把那邊的sample也拿過來: 題意好理解,就對條件3解釋一下: 如果 aPbTc 是正確的,那麼 aPbATca 也是正確的,其中 a、 b、 c 均或者是空字串,或者是僅由字母 A 組成的字串。 就相當於是先對aPbATca進行操作成aPb
Find a way(兩個BFS)
city any queue ret find 初始化 typedef 維數 opened Problem Description Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo a
51Nod 1095 Anigram單詞 (兩次map)
一個單詞a如果通過交換單詞中字母的順序可以得到另外的單詞b,那麼定義b是a的Anigram,例如單詞army和mary互為Anigram。另:相同的2個單詞不算Anigram。現在給定一個字典,輸入Q個單詞,從給出的字典中找出這些單詞的Anigram。 收起 輸入 第1行:1個數N,表示
1111 Online Map (30 分)(兩次dij)
1111 Online Map (30 分) Input our current position and a destination, an online map can recommend several paths. Now your job is to recommend two pat
Silver Cow Party(兩次Dijstra)
Silver Cow Party One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1…N is going to attend the big cow party to be held at farm #
傳輸中文的亂碼的原因及解決方式(兩次encodeURI())轉碼;
.encodeURL函式主要是來對URI來做轉碼,它預設是採用的UTF-8的編碼. . UTF-8編碼的格式:一個漢字來三個位元組構成,每一個位元組會轉換成16進位制的編碼,同時新增上%號. 假設頁面端輸入的中文是一個 “中”,按照下面步驟進行解碼 1.第
基礎練習 2n皇后問題 (兩次DFS)
問題描述 給定一個n*n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩個白皇后都不在同一行、同一列或同一條對角線上。問總共有多少种放法?n小於等於8。 輸入格式 輸入的第一行為一個整數n,表示棋盤
筆試演算法題--股票買賣問題(兩次買賣)
題目:一個人一天只能進行最多兩次買和兩次賣,並且只有賣了才能繼續買。問一天可以獲得的最大收益,要採用時間複雜度低的實現。 股票價格為:10,22,5,75,65,80.答案:87(10買,22賣,5買,80賣) 動態規劃解決方法:設定陣列dp[i][j]表示:prices[
藍橋杯 PREV-9 大臣的旅費 (兩次DFS)
題意:求樹中最遠的兩個點的距離。 解題方案:第一遍dfs,任取一個點,找到離它最遠的點a,第二遍dfs,以a為起點,找到離a最遠的點b,ab即為樹中最遠的兩個點。證明:樹的直徑(最長路)的詳細證明。
藍橋杯之大臣的旅費(兩次dfs)
之間 NPU fin ble 過大 編號 http sample 題目 Description 很久以前,T王國空前繁榮。為了更好地管理國家,王國修建了大量的快速路,用於連接首都和王國內的各大城市。 為節省經費,T國的大臣們經過思考,制定了一套優秀的修建方案,使得任
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 live 7638 Number of Connected Components (並查集)
txt 通過 open main eps div cte efi ive 題目鏈接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_
轉載找回丟失的手機,順便把小偷繩之於法!親測管用!(內含些技術)
我想 manage ip定位 第一次 jcu mar 操作 ges base 找回丟失的手機,順便把小偷繩之於法!親測管用! 2017-12-11 帕尼尼 智能江湖 編者按:不想戳穿你們了,點進來的童鞋肯定都試過丟手機……小編最近在網上看到一個有意思的故事:一位大神的
成為大數據頂尖程序員,先過了這些Hadoop面試題!(附答案解析)
大禮包 雲計 default blank mas 阻止 launcher inpu 建立 導讀:在大數據開發崗位的需求下,工資待遇水漲船高,不少編程人員在面對職業瓶頸期的時候,會選擇轉編程方向發展。你是否已經意識這是你人生中的一個重要轉機?能不能抓住這個時代的機遇,就在於你
UVa 10213 - How Many Pieces of Land ?(歐拉公式)
href big input idt ble 技術 n-1 tro bsp 鏈接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem
nginx + uwsgi 發布django項目!(linux為centos7)
python erro gzip spa stub daemon 直接 appname del 1.在linux上安裝python3,參考鏈接:https://www.cnblogs.com/kimyeee/p/7250560.html 安裝python3時候,建議不要更改