算法:BFS

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.

Input

The first line of input contains a single integer, the number of test

cases to follow. The first line of each test case contains the two

integers R and C, separated by spaces, with 1 ≤ R, C ≤ 1000. The

following R lines of the test case each contain one row of the maze. Each of these lines contains exactly

C characters, and each of these characters is one of:

• #, a wall

• ., a passable square

• J, Joe’s initial position in the maze, which is a passable square

• F, a square that is on fire

There will be exactly one J in each test case.

Output

For each test case, output a single line containing ‘IMPOSSIBLE’ if Joe cannot exit the maze before the

fire reaches him, or an integer giving the earliest time Joe can safely exit the maze, in minutes.

Sample Input

2

4 4

####

#JF#

#..#

#..#

3 3

###

#J.

#.F

Sample Output

3

IMPOSSIBLE

注意开始有多个火堆;

代码:

#include <iostream>
#include <cstring>
#include <iomanip>
#include <stdio.h>
#include <queue>
#include <algorithm>
#define INF 100000000
using namespace std;
char ch[1005][1005];
int b[1005][1005],c[1004][1005],qq,cnt,d[1005][2];
int n,m,a[4][2]={-1,0,0,-1,0,1,1,0},p,q;
struct dot
{
int x,y,step;
};
void bfs()
{ memset(c,0,sizeof(c));
queue<dot>que;
dot cur,loer;
for(int i=0;i<cnt;i++)
{
cur.x=d[i][0];
cur.y=d[i][1];
cur.step=0;
b[cur.x][cur.y]=0;
c[cur.x][cur.y]=1;
que.push(cur);
}
while(que.size())
{
loer=que.front();
que.pop();
for(int i=0;i<4;i++)
{
int dx,dy;
dx=loer.x+a[i][0];
dy=loer.y+a[i][1];
if(dx>=0&&dx<n&&dy>=0&&dy<m&&ch[dx][dy]=='.'&&!c[dx][dy])
{
cur.x=dx;cur.y=dy;cur.step=loer.step+1;
b[dx][dy]=min(cur.step,b[dx][dy]);
c[dx][dy]=1;
que.push(cur);
}
}
}
}
void bsf()
{ memset(c,0,sizeof(c));
queue<dot>que;
dot cur,loer;
cur.x=p;
cur.y=q;
cur.step=0;
c[p][q]=1;
que.push(cur);
while(que.size())
{
loer=que.front();
que.pop();
if(loer.x==0||loer.x==n-1||loer.y==0||loer.y==m-1)
{ qq=1;
cout<<loer.step+1<<endl;
break;
}
for(int i=0;i<4;i++)
{
int dx,dy;
dx=loer.x+a[i][0];
dy=loer.y+a[i][1];
if(dx>=0&&dx<n&&dy>=0&&dy<m&&ch[dx][dy]=='.'&&!c[dx][dy]&&b[dx][dy]>loer.step+1)
{
cur.x=dx;
cur.y=dy;
cur.step=loer.step+1;
c[dx][dy]=1;
que.push(cur);
}
}
}
}
int main()
{
int T,i,j,k;
cin>>T;
while(T--)
{
cin>>n>>m;
cnt=0;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
cin>>ch[i][j];
b[i][j]=INF;
if(ch[i][j]=='J')
{
p=i;q=j;
ch[i][j]='.';
}
else if(ch[i][j]=='F')
{
d[cnt][0]=i;
d[cnt++][1]=j;
}
}
}
qq=0; bfs();
bsf();
if(qq==0) cout<<"IMPOSSIBLE"<<endl;
}
return 0;
}

uva Fire!的更多相关文章

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

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

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

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

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

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

  4. UVA 11642 Fire!

    Fire! Time Limit: 1000ms Memory Limit: 131072KB This problem will be judged on UVA. Original ID: 116 ...

  5. UVA 11624 - Fire! 图BFS

    看题传送门 昨天晚上UVA上不去今天晚上才上得去,这是在维护么? 然后去看了JAVA,感觉还不错昂~ 晚上上去UVA后经常连接失败作死啊. 第一次做图的题~ 基本是照着抄的T T 不过搞懂了图的BFS ...

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

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

  7. UVA 11624 Fire!(广度优先搜索)

    题目大意:在一个N*M的迷宫内,J代表某人(只有一个),F代表火(可能不只一个),#代表墙,火每分钟会向四周除了墙以外的地方扩散一层,问人能否在没被火烧到 之前逃出迷宫,若能逃出输出最短时间.很明显的 ...

  8. UVa 11624 Fire!(BFS)

    Fire! Time Limit: 5000MS   Memory Limit: 262144KB   64bit IO Format: %lld & %llu Description Joe ...

  9. uva 11624 Fire!(搜索)

    开始刷题啦= = 痛并快乐着,学到新东西的感觉其实比看那些无脑的小说.电视剧有意思多了 bfs裸体,关键是先把所有的着火点放入队列,分开一个一个做bfs会超时的 发现vis[][]是多余的,完全可以用 ...

随机推荐

  1. 【转】C++成员函数的存储方式

    [转] http://c.biancheng.net/cpp/biancheng/view/187.html 用类去定义对象时,系统会为每一个对象分配存储空间.如果一个类包括了数据和函数,要分别为数据 ...

  2. Mac下安装 php+nginx+mysql 开发环境

    一.mysql安装 mysql是安装最简单顺利的 1. 首先去官方网站下载Mac适用的MySQL的dmg包 下载页面 选择图中最下方的dmg包下载进行安装 安装完成后 MySQL的安装目录为/usr/ ...

  3. ubuntu soft install

    1.Mysql 安装就三个命令 mysql服务端 sudo apt-get install mysql-server mysql客户端 sudo apt-get install mysql-clien ...

  4. C 带指针样式的时钟

    #include <stdio.h> #include <malloc.h>#include<graphics.h>#include<conio.h> ...

  5. IIC 概述之2

    一.协议 1.空闲状态 I2C总线总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态.此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高. ...

  6. Spring security oauth2最简单入门环境搭建

    关于OAuth2的一些简介,见我的上篇blog:http://wwwcomy.iteye.com/blog/2229889 PS:貌似内容太水直接被鹳狸猿干沉.. 友情提示 学习曲线:spring+s ...

  7. xdebug及webgrind的联用

    参考URL: http://www.tuicool.com/articles/ERFNva http://blog.sina.com.cn/s/blog_635833b3010127q5.html h ...

  8. 读书笔记:java并发

    java中主要的同步机制是关键字synchronized,它提供一种独占锁,但是 同步这个术语还包括validate类型的变量,显示锁(Explicit Lock)以及原子变量. -------显示锁 ...

  9. hdu1796:容斥入门题

    简单的容斥入门题.. 容斥基本的公式早就知道了,但是一直不会写. 下午看到艾神在群里说的“会枚举二进制数就会容斥”,后来发现还真是这样.. 然后直接贴代码了 #include <iostream ...

  10. Xcode7中你一定要知道的炸裂调试神技(转)

    1.Address Sanitizer: 妈妈再也不用担心 EXC_BAD_ACCESS? EXC_BAD_ACCESS一直是很多开发者的噩梦,因为这个错误很不直观,出现后往往要花很长时间才能定位到错 ...