UVA 11624 BFS的妙用
题意:
迷宫里起火了,有若干个障碍物,有多个起火点,起火点每经过一个时间间隔就向它的上下左右相邻的格子扩散。
有个倒霉的人好像叫做“Joe”,他要逃出来,他每次可以向上下左右任意移动一格,但是即要避开火也要避开障碍物,问你他如果逃得出来的话至少要多少步。
没有着火点的话就直接,bfs了,但是有的话就稍微与处理一下,我们可以通过对着火点bfs,从而知道每个格子在什么时间着火。
这样的话,只要先bfs着火点,把每个格子在什么时间着火保存到数组里;然后bfs那个人,在判断他可不可以那个格子的check函数增加一步,检查他走过去的时间是不是小于起火的时间。
源代码:
#include <stdio.h>
#include <string.h>
const int maxn=;
const int sizeq=;
bool vis[maxn][maxn];
int fi[maxn][maxn],dis[maxn][maxn];
char map[maxn][maxn];
int dir[][]={{-,},{,},{,-},{,}};
int T,R,C,ans;
bool flag; struct Node{
int x,y;
};
Node q[sizeq];
int font,rear;
void Enqueue(Node x)
{
q[rear++]=x;
if(rear==sizeq) rear=;
}
Node Dequeue()
{
Node z=q[font++];
if(font==sizeq) font=;
return z;
}
bool check(Node nd)
{
return nd.x<||nd.y<||nd.x>=R||nd.y>=C||map[nd.x][nd.y]=='#'||vis[nd.x][nd.y];
}
void fire()
{
Node f,nx;
memset(fi,,sizeof(fi));
memset(vis,,sizeof(vis));
font=rear=;
for(int i=;i<R;i++){
for(int j=;j<C;j++){
if(map[i][j]=='F'){
f.x=i;
f.y=j;
fi[i][j]=;
vis[i][j]=;
Enqueue(f);
}
}
}
while(font!=rear){
f=Dequeue();
for(int i=;i<;i++){
nx.x=f.x+dir[i][];
nx.y=f.y+dir[i][];
if(check(nx))continue;
fi[nx.x][nx.y]=fi[f.x][f.y]+;
vis[nx.x][nx.y]=;
Enqueue(nx);
}
}
} bool safe(Node x,int d)
{
return !check(x) && (fi[x.x][x.y]>d||fi[x.x][x.y]==);
} int bfs()
{
Node u,v;
font=rear=;
memset(dis,,sizeof(dis));
memset(vis,,sizeof(vis));
for(int i=;i<R;i++){
for(int j=;j<C;j++){
if(map[i][j]=='J'){
u.x=i;
u.y=j;
Enqueue(u);
vis[i][j]=;
dis[i][j]=;
}
}
}
while(font!=rear){
u=Dequeue();
if(u.x==||u.x==R-||u.y==||u.y==C-){
return dis[u.x][u.y];
}
for(int i=;i<;i++){
v.x=u.x+dir[i][];
v.y=u.y+dir[i][];
if(!safe(v,dis[u.x][u.y]+))continue;
Enqueue(v);
vis[v.x][v.y]=;
dis[v.x][v.y]=dis[u.x][u.y]+;
}
}
return ;
} int main()
{
scanf("%d",&T);
while(T--){
scanf("%d %d",&R,&C);
for(int i=;i<R;i++)scanf("%s",map[i]);
fire();
ans=bfs();
if(ans){
printf("%d\n",ans);
}else{
puts("IMPOSSIBLE");
}
} }
UVA 11624 BFS的妙用的更多相关文章
- uva 11624(bfs)
11624 - Fire! Time limit: 1.000 seconds Joe works in a maze. Unfortunately, portions of the maze hav ...
- UVa 11624 (BFS) Fire!
也是一个走迷宫的问题,不过又有了点变化. 这里迷宫里有若干把火,而且火每秒也是向四个方向蔓延的.问人是否能走出迷宫. 我用了两遍BFS,第一遍把所有着火的格子加入队列,然后计算每个格子着火的时间. 第 ...
- UVA - 11624 Fire! bfs 地图与人一步一步先后搜/搜一次打表好了再搜一次
UVA - 11624 题意:joe在一个迷宫里,迷宫的一些部分着火了,火势会向周围四个方向蔓延,joe可以向四个方向移动.火与人的速度都是1格/1秒,问j能否逃出迷宫,若能输出最小时间. 题解:先考 ...
- BFS(两点搜索) UVA 11624 Fire!
题目传送门 /* BFS:首先对火搜索,求出火蔓延到某点的时间,再对J搜索,如果走到的地方火已经烧到了就不入队,直到走出边界. */ /******************************** ...
- UVA 11624 UVA 10047 两道用 BFS进行最短路搜索的题
很少用bfs进行最短路搜索,实际BFS有时候挺方便得,省去了建图以及复杂度也降低了O(N*M): UVA 11624 写的比较挫 #include <iostream> #include ...
- E - Fire! UVA - 11624(bfs + 记录火到达某个位置所需要的最小时间)
E - Fire! UVA - 11624 题目描述 乔在迷宫中工作.不幸的是,迷宫的一部分着火了,迷宫的主人没有制定火灾的逃跑计划.请帮助乔逃离迷宫.根据乔在迷宫中的位置以及迷宫的哪个方块着火,你必 ...
- UVa 11624 Fire!(着火了!)
UVa 11624 - Fire!(着火了!) Time limit: 1.000 seconds Description - 题目描述 Joe works in a maze. Unfortunat ...
- UVa 11624,两次BFS
题目链接:http://vjudge.net/contest/132239#problem/A 题目链接:https://uva.onlinejudge.org/external/116/11624. ...
- UVA 11624 Fire! bfs 难度:0
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
随机推荐
- http状态码详解
1 网址协议不支持的协议. 2 检测器内部错误. 3 网址格式不正确. 5 无法连接到代理服务器. 6 无法连接到服务器或找不到域名. 7 连接服务器失败. 28 操作超时.可能原因:页面执行时间过长 ...
- git add 命令
git add xx命令可以将xx文件添加到暂存区,如果有很多改动可以通过 git add -A .来一次添加所有改变的文件. 注意 -A 选项后面还有一个句点. git add -A表示添加所有内容 ...
- [转]RMAN检测数据库坏块
backup validate check logical database; select * from v$database_block_corruption; RMAN> backup v ...
- C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别
转自:http://www.cnblogs.com/leolis/p/3968943.html 在编程过程中,数据转换是经常要用到的,C#中数据转换的方法很多,拿将目标对象转换为 整型(int)来讲, ...
- JavaScript之闭包就是个子公司
在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数.这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外.所以,有 ...
- Android-简单拨号器案例
Android [19]简单电话拨号器 @方法步骤 1.新建一个android程序,项目名设置为 phone ,然后打开 phone->res->layout->activity ...
- C# 方法的回调(上)
在C#编程中方法的回调有以下几种方式 通过接口.通过委托.定时回调.多线程回调,异步回调 下面就以代码的形式来讲解这种方式 通过接口回调 代码示例如下 定义接口,定义了一个Run 方法: interf ...
- LeakCanary 内存检测 工具 --超级傻瓜 不会DDMS的福音
大神资料贴出 ,学习 ,集成到项目中 . LeakCanary 中文使用说明 http://www.liaohuqiu.net/cn/posts/leak-canary/ logcat 显示 ...
- remi
很简单呀,又不用自己编译.用 http://rpms.remirepo.net/ 这个 remi 的包,直接 yum install php-swoole 就完事了 安装remi包也很简单, yum ...
- JMeter学习-034-JMeter调试工具之一---HTTP Mirror Server
通常,编程工具IDE都提供了相应的调试模块,供开发者使用,以便更快速的定位问题所在.那么在JMeter编写测试脚本的过程中,JMeter都提供了哪些调试工具供我们使用呢? JMeter常用的调试工具有 ...