1. 程式人生 > >uva 11624 大火蔓延的迷宮 Fire!(兩次bfs)

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 大火蔓延迷宮 Firebfs

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

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 PartyDijstra

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時候,建議不要更改