题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2671

题目大意:一个n*m迷宫,迷宫中有一个点'J'是人也就是起点,有多个点'F'表示着火,人每秒都可以往水平或垂直方向走,火势也可以往水平或垂直方向蔓延,火和人都不能过'#',但可以过‘.’。问人最后能否从迷宫逃出,不被火烧到。

解题思路:两次bfs,第一次求各点被火烧到的最小时间用step[x][y]记录,如果烧不到就是inf。第二次bfs,求从起点能否逃出迷宫,但是比如说下一步走到(x,y)时间是t,t如果>=step[x][y]则这个点不能走,因为走到这里时,这里已经备火势蔓延了。注意:有多个着火点,看了我两个小时。气死我了啊啊啊!!!

代码:

 #include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int N=1e3+;
const int inf=0x3f3f3f3f; struct node{
int x,y,step;
}pre,now; int m,n,ans,cnt,x1,y1;
int d[][]={{,},{,},{-,},{,-}};
char map[N][N];
int vis[N][N],step[N][N];//step[x][y]记录被各点烧到的最短时间 struct node2{
int x,y;
}point[N*N]; //求着火时间
void bfs1(){
queue<node>q;
for(int i=;i<=cnt;i++){
int x=point[i].x;
int y=point[i].y;
now.x=x;
now.y=y;
now.step=;
step[x][y]=;
q.push(now);
}
while(!q.empty()){
pre=q.front();
q.pop();
for(int i=;i<;i++){
int xx=pre.x+d[i][];
int yy=pre.y+d[i][];
int t=pre.step+;
if(xx<||yy<||xx>n||yy>m||map[xx][yy]=='#'||step[xx][yy]!=inf)
continue;
step[xx][yy]=t;
now.x=xx;
now.y=yy;
now.step=t;
q.push(now);
}
}
}
//求是否能逃出去
bool bfs2(){
queue<node>q;
now.x=x1;
now.y=y1;
now.step=;
q.push(now);
while(!q.empty()){
pre=q.front();
q.pop();
for(int i=;i<;i++){
int xx=pre.x+d[i][];
int yy=pre.y+d[i][];
int t=pre.step+;
if(t>=step[xx][yy]||map[xx][yy]=='#'||vis[xx][yy])
continue;
if(xx<||yy<||xx>n||yy>m){
ans=t;
return true;
}
vis[xx][yy]=;
now.x=xx;
now.y=yy;
now.step=t;
q.push(now);
}
}
return false;
} int main(){
int T;
scanf("%d",&T);
while(T--){
cnt=;
memset(vis,,sizeof(vis));
memset(step,0x3f,sizeof(step));
memset(map,'.',sizeof(map));
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
getchar();
for(int j=;j<=m;j++){
scanf("%c",&map[i][j]);
if(map[i][j]=='F'){
point[++cnt].x=i;
point[cnt].y=j;
}
if(map[i][j]=='J')
x1=i,y1=j;
}
}
bfs1();
if(!bfs2())
puts("IMPOSSIBLE");
else
printf("%d\n",ans);
}
return ;
}

UVA 11624 Fire!(两次BFS+记录最小着火时间)的更多相关文章

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

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

  2. UVa 11624,两次BFS

    题目链接:http://vjudge.net/contest/132239#problem/A 题目链接:https://uva.onlinejudge.org/external/116/11624. ...

  3. UVA 11624 Fire!(二次BFS)

    先对火BFS一次,求出每个点的最小着火时间. 再对人BFS一次,求出走到边界的最少时间. #include <iostream> #include <queue> #inclu ...

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

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

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

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

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

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

  7. UVA - 11624 Fire! 【BFS】

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

  8. UVA 11624 Fire! BFS搜索

    题意:就是问你能不能在火烧到你之前,走出一个矩形区域,如果有,求出最短的时间 分析:两遍BFS,然后比较边界 #include<cstdio> #include<algorithm& ...

  9. UVA 11624 Fire!【两点BFS】

    Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the owner of the m ...

随机推荐

  1. [NOIP2008]双栈排序 【二分图 + 模拟】

    题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...

  2. 洛谷八连测R5题解

    woc居然忘了早上有八连测T T 还好明早还有一场...今天的题除了T3都挺NOIP的... T1只需要按横坐标第一关键字,纵坐标第二关键字排序一个一个取就好了... #include<iost ...

  3. 【OpenCV入门教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑

    http://blog.csdn.net/poem_qianmo/article/details/26977557 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog ...

  4. MFC中CListCtrl类依靠CImageList贴图并显示不同图像

    只介绍主要方法,函数的具体参数可在MSDN上查阅 ------------------------------------------- CListCtrl     m_ListCtrl; CImag ...

  5. hashlib模块--加密

    用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 import hashlib m = ha ...

  6. Python基础之面向对象(初级篇)

    概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向过程编程最易被初学 ...

  7. 解决gridview row 左边序列号 显示不完全的技巧

    放在主程序 入口处, public Form1() { InitializeComponent(); gridView1.IndicatorWidth = ; //<宽度值>官方推荐常用是 ...

  8. ASP.NET 3.5控件和组件开发技术之客户端回发/回调揭密

    本文摘录自<纵向切入ASP.NET 3.5控件和组件开发技术>. 对于服务端控件元素,比如ASP.NET的Button标准服务端控件在提交时可以自动把请求发送到服务端处理,这样的控件我们不 ...

  9. 在mac上安装ruby

    1.先装RVM,一个多版本ruby环境的管理和切换工具 curl -sSL https://get.rvm.io | bash -s stable 会自动装上最新版.更新RVM版本:$ rvm get ...

  10. layui实现类似于bootstrap的模态框功能

    以前习惯了bootstrap的模态框,突然换了layui,想的用layui实现类似于bootstrap的模态框功能. 用到了layui的layer模块,例如: <!DOCTYPE html> ...