题意:

迷宫里起火了,有若干个障碍物,有多个起火点,起火点每经过一个时间间隔就向它的上下左右相邻的格子扩散。

有个倒霉的人好像叫做“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的妙用的更多相关文章

  1. uva 11624(bfs)

    11624 - Fire! Time limit: 1.000 seconds Joe works in a maze. Unfortunately, portions of the maze hav ...

  2. UVa 11624 (BFS) Fire!

    也是一个走迷宫的问题,不过又有了点变化. 这里迷宫里有若干把火,而且火每秒也是向四个方向蔓延的.问人是否能走出迷宫. 我用了两遍BFS,第一遍把所有着火的格子加入队列,然后计算每个格子着火的时间. 第 ...

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

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

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

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

  5. UVA 11624 UVA 10047 两道用 BFS进行最短路搜索的题

    很少用bfs进行最短路搜索,实际BFS有时候挺方便得,省去了建图以及复杂度也降低了O(N*M): UVA 11624 写的比较挫 #include <iostream> #include ...

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

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

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

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

  8. UVa 11624,两次BFS

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

  9. UVA 11624 Fire! bfs 难度:0

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

随机推荐

  1. http状态码详解

    1 网址协议不支持的协议. 2 检测器内部错误. 3 网址格式不正确. 5 无法连接到代理服务器. 6 无法连接到服务器或找不到域名. 7 连接服务器失败. 28 操作超时.可能原因:页面执行时间过长 ...

  2. 快排查找第K小的数

    #include "iostream.h" using namespace std; int findMedian(int *A,int left,int right){ int ...

  3. Odoo 8.0 new API 之Environment

    """ An environment wraps data for ORM records: - :attr:`cr`, the current database cur ...

  4. ubuntu14.04下安装ngnix,mediawiki,nodebb,everything,gitlab

    本周折腾了以下几个东西,mediawiki(维基),nodebb(论坛),gitlab(私有git服务器). 本来的目的是搭建一个wiki,选用了mediawiki后,使用apache搭建好了. 搭论 ...

  5. mysql数据库迁移

    由于yum安装mysql的时候,数据库的data目录默认是在/var/lib下,出于数据安全性的考虑需要把它挪到/data分区.步骤如下: 一.关闭apache和mysql. 复制代码 代码如下: s ...

  6. 文本编辑器VIM/VI

    vim/vi  功能强大全屏文本编辑器.主要是建立,编辑,显示文本. www.vim.org  构建shell脚本 :set number 使文件出现行号 a 光标后附件文件     i在光标前插入文 ...

  7. [计算机故障]windows8+IE11显示无法登陆网页

    同事的一款SURFACE,跑的WINDOWS 8.1.最近发现从开始菜单里的win8.1的浏览器可以上网,但是通过任务栏的快捷方式,又上不了网.尝试重置了IE11,安装了Google Chrome.但 ...

  8. PHP之简单实现MVC框架

    PHP之简单实现MVC框架   1.概述 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种 ...

  9. FTP提示505错误解决办法

    使用ServerU建FTP服务器时,选定了锁定主文件夹,不选即可解决问题.

  10. Multiprocessor Operating System Design Considerations SYMMETRIC MULTIPROCESSORS

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION An SMP operating syst ...