(简单) UVA 11624 Fire! ,BFS。
Description
Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the owner of the maze neglected to create a fire escape plan. Help Joe escape the maze.
Given Joe's location in the maze and which squares of the maze are on fire, you must determine whether Joe can exit the maze before the fire reaches him, and how fast he can do it.
Joe and the fire each move one square per minute, vertically or horizontally (not diagonally). The fire spreads all four directions from each square that is on fire. Joe may exit the maze from any square that borders the edge of the maze. Neither Joe nor the fire may enter a square that is occupied by a wall.
题目就是迷宫问题,然后加了火,不过这个题被坑了,原来火不只是一个,可以有很多个。。。
这个题先从火BFS一遍,这样就可以知道火多长时间后烧到某一块,然后从人BFS,当走到这时火已经烧过来的话就算不能通过就好了。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath> using namespace std; bool map1[][];
int rem[][];
int Frem[][];
int N,M;
int Si,Sj,Fi[],Fj[];
int cou; bool judge(int x,int y,int temp)
{
if(x<=||y<=||x>N||y>M)
return ; if(!map1[x][y])
return ; if(rem[x][y])
return ; if(Frem[x][y]>-&&temp>=Frem[x][y])
return ; return ;
} bool judge1(int x,int y)
{
if(x<=||y<=||x>N||y>M)
return ; if(!map1[x][y])
return ; if(Frem[x][y]!=-)
return ; return ;
} int slove()
{
queue <int> que;
int temp,t1,t2; que.push(Si*+Sj);
rem[Si][Sj]=; while(!que.empty())
{
temp=que.front();
que.pop(); t1=temp/;
t2=temp%;
temp=rem[t1][t2]; if(t1==||t2==||t1==N||t2==M)
return temp; --t1;
if(judge(t1,t2,temp))
{
que.push(t1*+t2);
rem[t1][t2]=temp+;
}
t1+=;
if(judge(t1,t2,temp))
{
que.push(t1*+t2);
rem[t1][t2]=temp+;
}
--t1;
--t2;
if(judge(t1,t2,temp))
{
que.push(t1*+t2);
rem[t1][t2]=temp+;
}
t2+=;
if(judge(t1,t2,temp))
{
que.push(t1*+t2);
rem[t1][t2]=temp+;
}
} return -;
} void init()
{
queue <int> que;
int temp,t1,t2;
for(int i=;i<cou;++i)
{
que.push(Fi[i]*+Fj[i]);
Frem[Fi[i]][Fj[i]]=;
} while(!que.empty())
{
temp=que.front();
que.pop(); t1=temp/;
t2=temp%;
temp=Frem[t1][t2]; --t1;
if(judge1(t1,t2))
{
que.push(t1*+t2);
Frem[t1][t2]=temp+;
}
t1+=;
if(judge1(t1,t2))
{
que.push(t1*+t2);
Frem[t1][t2]=temp+;
}
--t1;
--t2;
if(judge1(t1,t2))
{
que.push(t1*+t2);
Frem[t1][t2]=temp+;
}
t2+=;
if(judge1(t1,t2))
{
que.push(t1*+t2);
Frem[t1][t2]=temp+;
}
}
} int main()
{
ios::sync_with_stdio(false); int T;
int ans;
char c;
cin>>T; while(T--)
{
cou=;
cin>>N>>M;
for(int i=;i<=N;++i)
for(int j=;j<=M;++j)
{
rem[i][j]=;
Frem[i][j]=-;
cin>>c;
if(c=='#'||c=='F')
map1[i][j]=;
else
map1[i][j]=; if(c=='J')
Si=i,Sj=j;
if(c=='F')
{
Fi[cou]=i;
Fj[cou++]=j;
}
} init(); ans=slove(); if(ans==-)
cout<<"IMPOSSIBLE\n";
else
cout<<ans<<endl;
} return ;
}
(简单) UVA 11624 Fire! ,BFS。的更多相关文章
- UVA - 11624 Fire! bfs 地图与人一步一步先后搜/搜一次打表好了再搜一次
UVA - 11624 题意:joe在一个迷宫里,迷宫的一些部分着火了,火势会向周围四个方向蔓延,joe可以向四个方向移动.火与人的速度都是1格/1秒,问j能否逃出迷宫,若能输出最小时间. 题解:先考 ...
- UVA 11624 Fire! (bfs)
算法指南白书 分别求一次人和火到达各个点的最短时间 #include<cstdio> #include<cstring> #include<queue> #incl ...
- UVA 11624 Fire! bfs 难度:0
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- UVA 11624 Fire! BFS搜索
题意:就是问你能不能在火烧到你之前,走出一个矩形区域,如果有,求出最短的时间 分析:两遍BFS,然后比较边界 #include<cstdio> #include<algorithm& ...
- BFS(两点搜索) UVA 11624 Fire!
题目传送门 /* BFS:首先对火搜索,求出火蔓延到某点的时间,再对J搜索,如果走到的地方火已经烧到了就不入队,直到走出边界. */ /******************************** ...
- UVa 11624 Fire!(着火了!)
UVa 11624 - Fire!(着火了!) Time limit: 1.000 seconds Description - 题目描述 Joe works in a maze. Unfortunat ...
- E - Fire! UVA - 11624(bfs + 记录火到达某个位置所需要的最小时间)
E - Fire! UVA - 11624 题目描述 乔在迷宫中工作.不幸的是,迷宫的一部分着火了,迷宫的主人没有制定火灾的逃跑计划.请帮助乔逃离迷宫.根据乔在迷宫中的位置以及迷宫的哪个方块着火,你必 ...
- UVA 11624 - Fire! 图BFS
看题传送门 昨天晚上UVA上不去今天晚上才上得去,这是在维护么? 然后去看了JAVA,感觉还不错昂~ 晚上上去UVA后经常连接失败作死啊. 第一次做图的题~ 基本是照着抄的T T 不过搞懂了图的BFS ...
- UVa 11624 Fire!(BFS)
Fire! Time Limit: 5000MS Memory Limit: 262144KB 64bit IO Format: %lld & %llu Description Joe ...
随机推荐
- java.sql.ResultSet技术(从数据库查询出的结果集里取列值)
里面有一个方法可以在查询的结果集里取出列值,同理,存储过程执行之后返回的结果集也是可以取到的. 如图: 然后再运用 java.util.Hashtable 技术.把取到的值放入(K,V)的V键值里,K ...
- 两种方法将oracle数据库中的一张表的数据导入到另外一个oracle数据库中
oracle数据库实现一张表的数据导入到另外一个数据库的表中的方法有很多,在这介绍两个. 第一种,把oracle查询的数据导出为sql文件,执行sql文件里的insert语句,如下: 第一步,导出sq ...
- linux 命令汇总
一 Grep 命令 各种参数: -i:ignore-case忽略大小写 -c :打印匹配的行数 -l :从多个文件中查找包含匹配项 -v :查找不包含匹配项的行 -n :打印包含匹配项的行和行标 -w ...
- Android OpenGL ES(十三)通用的矩阵变换指令 .
Android OpenGL ES 对于不同坐标系下坐标变换,大都使用矩阵运算的方法来定义和实现的.这里介绍对应指定的坐标系(比如viewmodel, projection或是viewport) An ...
- [Python]网络爬虫(四):Opener与Handler的介绍和实例应用
在开始后面的内容之前,先来解释一下urllib2中的两个个方法:info and geturl urlopen返回的应答对象response(或者HTTPError实例)有两个很有用的方法info() ...
- setter getter 属性 点语法
转载自:http://liuyafang.blog.51cto.com/8837978/1543715 什么时setter,getter, 在OC里, 为实例变量赋zhi的方法称作setter(设置器 ...
- sessionStorage用于分页,瀑布流和存储用户数据等
在手机网页开发中,会用到分页和瀑布流来分量显示数据.这里会遇到一个问题.当点击某条数据进入详情后,再按手机的返回键会到上一个页面,该页面是重新加载的. 本人在微信里用内置的qq浏览器打开页面,wind ...
- URAL 2099 Space Invader题解 (计算几何)
啥也不说了,直接看图吧…… 代码如下: #include<stdio.h> #include<iostream> #include<math.h> using na ...
- Python虚拟环境安装virtualenv
解决了多个版本共存的问题 virtualenv 为每个不同项目提供一份 Python 安装.它并没有真正安装多个 Python 副本,但是它确实提供了一种巧妙的方式来让各项目环境保持独立. 安装vir ...
- oracle 管理
1.管理数据的用户主要是:sys和system. 区别:(1)sys所有oracle的数据字典的基表和视图都存放在sys用户中,这些基表和视图对于oracle是至关重要的,由数据库自己维护,任何用户都 ...