题目链接

题意:J代表Joe的位置,F代表火的起点,下一刻火将会向四周扩散,求Joe逃离的最短时间,如果不能逃离输出IMPOSSIBLE;

注意火的起点可能不止一处

可以用两次bfs分别求出人到达某个位置所用时间和火到达某个位置所用时间

 #include<iostream>
#include<stdio.h>
#include<string.h>
#define INF 0xfffffff
#include<queue>
#include<algorithm>
using namespace std;
#define N 1010 int dir[][]={ {,},{-,},{,-},{,} };
char map[N][N];
int people[N][N], fire[N][N];//分别代表人和火到达该位置的时间;
int n, m, k, vis[N][N];
struct node
{
int x,y;
}f[N*N];//火的位置;可能不止一处; void FireBfs()
{
queue<node> Q;
node p, q;
memset(vis, , sizeof(vis));
memset(fire, -, sizeof(fire));
for(int i=; i<k; i++)
{
Q.push(f[i]);
fire[f[i].x][f[i].y] = ;
vis[f[i].x][f[i].y]=;
}
while(Q.size())
{
p = Q.front(); Q.pop();
for(int i=; i<; i++)
{
q.x=p.x+dir[i][];
q.y=p.y+dir[i][];
if(q.x>= && q.y>= && q.x<n && q.y<m && vis[q.x][q.y]== && map[q.x][q.y]!='#')
{
fire[q.x][q.y] = fire[p.x][p.y] + ;
vis[q.x][q.y] = ;
Q.push(q);
}
}
}
}
int PeopleBfs(node s)
{
queue<node> Q;
node p, q;
memset(vis, , sizeof(vis));
memset(people, -, sizeof(people));
Q.push(s);
people[s.x][s.y] = ;
vis[s.x][s.y] = ;
while(Q.size())
{
p = Q.front(); Q.pop();
if(p.x==||p.x==n-||p.y==||p.y==m-)
{
if((people[p.x][p.y] != - && people[p.x][p.y]<fire[p.x][p.y]) || (people[p.x][p.y] != -&&fire[p.x][p.y] == -) )//能到达边界并且在火到达之前;
return people[p.x][p.y];
} for(int i=; i<; i++)
{
q.x = p.x + dir[i][];
q.y = p.y + dir[i][];
if(q.x>= && q.x<n && q.y>= && q.y<m && vis[q.x][q.y]== && map[q.x][q.y]!='#')
{
people[q.x][q.y] = people[p.x][p.y] + ;
vis[q.x][q.y] = ;
Q.push(q);
}
}
}
return -;
}
int main()
{
int T; scanf("%d", &T);
while(T--)
{
node J;
scanf("%d%d", &n, &m);
k = ;
for(int i=; i<n; i++)
{
scanf("%s", map[i]);
for(int j=; j<m; j++)
{
if(map[i][j]=='J')
J.x = i, J.y = j;
if(map[i][j]=='F')
f[k].x = i,f[k++].y = j;
}
}
FireBfs();
int ans = PeopleBfs(J);
if(ans==-)
printf("IMPOSSIBLE\n");
else
printf("%d\n", ans);
}
return ;
}

J - Fire!---UVA 11624的更多相关文章

  1. E - Fire! UVA - 11624(bfs + 记录火到达某个位置所需要的最小时间)

    E - Fire! UVA - 11624 题目描述 乔在迷宫中工作.不幸的是,迷宫的一部分着火了,迷宫的主人没有制定火灾的逃跑计划.请帮助乔逃离迷宫.根据乔在迷宫中的位置以及迷宫的哪个方块着火,你必 ...

  2. kuangbin专题 专题一 简单搜索 Fire! UVA - 11624

    题目链接:https://vjudge.net/problem/UVA-11624 题意:一个迷宫,可能有一个或者多个地方着火了,每过1个时间消耗,火会向四周蔓延,问Joe能不能逃出迷宫,只要走出迷宫 ...

  3. Fire! UVA - 11624 (两步bfs)

    题目链接 题意 人要从迷宫走出去,火会向四个方向同时扩散 分析 两步bfs,先出火到达各地时的时间(设初始时间为0,人每走一步为1s,在着一步内火可以向四周可触及的方向同时扩散),然后在bfs人,人能 ...

  4. Fire uva 11624

    题目连接:http://acm.hust.edu.cn/vjudge/problem/28833 /* 首先对整个图bfs一次得到火焰燃烧的时刻表 之后在bfs搜路径时加一个火烧表的判断 坑点在于:如 ...

  5. UVA - 11624 J - Fire! (BFS)

    题目传送门 J - Fire! Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the ...

  6. UVa 11624 Fire!(着火了!)

    UVa 11624 - Fire!(着火了!) Time limit: 1.000 seconds Description - 题目描述 Joe works in a maze. Unfortunat ...

  7. UVA - 11624 Fire! bfs 地图与人一步一步先后搜/搜一次打表好了再搜一次

    UVA - 11624 题意:joe在一个迷宫里,迷宫的一些部分着火了,火势会向周围四个方向蔓延,joe可以向四个方向移动.火与人的速度都是1格/1秒,问j能否逃出迷宫,若能输出最小时间. 题解:先考 ...

  8. BFS(两点搜索) UVA 11624 Fire!

    题目传送门 /* BFS:首先对火搜索,求出火蔓延到某点的时间,再对J搜索,如果走到的地方火已经烧到了就不入队,直到走出边界. */ /******************************** ...

  9. UVA - 11624 Fire! 【BFS】

    题意 有一个人 有一些火 人 在每一秒 可以向 上下左右的空地走 火每秒 也会向 上下左右的空地 蔓延 求 人能不能跑出来 如果能 求最小时间 思路 有一个 坑点 火是 可能有 多处 的 样例中 只有 ...

随机推荐

  1. 2. Oracle体系结构

    一. Oracle体系结构图 体系结构图如下: 体系结构图看似简单:其中很有玄机.它对Oracle来讲:相当于武功中的心法.配合体系结构来学Oracle:能起到事半功倍的效果.我们平时遇到Oracle ...

  2. bing搜索引擎子域名收集(Python脚本)

    利用bing搜索引擎进行子域名收集,编写了一个简单的Python脚本,分享一下. #! /usr/bin/env python # _*_ coding:utf-8 _*_ import reques ...

  3. wordpress for sae

    帮人建个站,准备用sae+wordpess,小研究一下 http://sae.sina.com.cn/?m=apps&a=detail&aid=1 http://wp4sae.org/ ...

  4. C#中的垃圾回收机制与delegate

    在DeepStream的C#版本调试过程中,发现了一个问题,运行一段时间后,大概每次内存到16M(Debug模式)就会异常 错误“System.NullReferenceException:未将对象引 ...

  5. Github上star和fork比较高的vim配置方案

    https://github.com/amix/vimrchttps://github.com/humiaozuzu/dot-vimrchttps://github.com/spf13/spf13-v ...

  6. 队列Queue中add()和offer()的区别?

    区别:两者都是往队列尾部插入元素,不同的时候,当超出队列界限的时候,add()方法是抛出异常让你处理,而offer()方法是直接返回false

  7. iOS - 直播总结(理论到实践)

    一.直播原理及流程 1.一个完整直播app原理 直播原理:把主播录制的视频,推送到服务器,在由服务器分发给观众观看. 直播环节:推流端(采集.美颜处理.编码.推流).服务端处理(转码.录制.截图.鉴黄 ...

  8. 很好用的php在线调试工具

    什么叫在线调试?就是在线上生产环境进行调试,假设有一天某个用户报某个页面某个数据怎么不对啊,看来线上出BUG了,于是你要迅速找出原因,首先看日志,可是悲剧的没有足够的日志让你确定线上BUG的原因,也许 ...

  9. 【转】strlen源码

    strlen源码剖析 学习高效编程的有效途径之一就是阅读高手写的源代码,CRT(C/C++ Runtime Library)作为底层的函数库,实现必然高效.恰好手中就有glibc和VC的CRT源代码, ...

  10. C常见机试题

    初级: 一.请编写函数long fun(long int x),功能是:将长整型数x中每一位上为奇数的数依次取出,并逆序和顺序分别构成一个新数返回.   例如:程序运行时输入123456789,输出: ...