题目大意:

F代表火焰

J代表人

一个人想在火焰烧到自己之前逃出着火地区

. 为路,人可以走,火可以燃烧(当然如果火先烧到就不能走了)

#为墙,不可走

如果能逃出,输出时间,不能,输出IMPOSSIBLE

每次移动上下左右(人火都是, 花费1)

解题思路:

简单广搜两次就行,先对火广搜,保存下步数,在对人广搜,看看走到此点花费的时间是不是比火小,小的话可以走,不然不能走,走到边界为逃出条件

具体实现用一个二维数组F

先对火焰进行广搜,用来保存每个点火燃烧到时花费的步数,初始值为0;
第二次广搜人走到此点需要的步数,如果小于此时此点保存的则证明可以走,走过之后赋值为-1;
火燃烧出发点赋值为-1;

代码:

#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack> using namespace std;
#define INF 0xfffffff
#define N 1010
int m, n;
char maps[N][N];
int dir[][] = {,, ,-, ,, -,};
int F[N][N];
/*F, 先对火焰进行广搜,用来保存每个点火燃烧到时花费的步数,初始值为0;
第二次广搜人走到此点需要的步数,如果小于此时此点保存的则证明可以走,走过之后赋值为-1;
火燃烧出发点赋值为-1,
*/ struct node
{
int x, y;
int step;
}s, e, a[N], q1; void Init()//初始化
{
memset(maps, , sizeof(maps));
memset(F, , sizeof(F));
memset(a, , sizeof(a));
} void BFS(int c)
{
queue<node>q; for(int i = ; i < c; i++) {
q.push(a[i]);
F[a[i].x][a[i].y] = -;
} while(q.size()) {//对火焰的广搜
q1 = q.front();
q.pop(); for(int i = ; i < ; i++) {
e.x = q1.x + dir[i][];
e.y = q1.y + dir[i][];
e.step = q1.step + ;
if(e.x >= && e.y >= && e.x < m && e.y < n && F[e.x][e.y] == && maps[e.x][e.y] == '.') {
F[e.x][e.y] = e.step;
q.push(e);
}
}
} q.push(s);
F[s.x][s.y] = -; while(q.size()) {//对人的广搜
q1 = q.front();
q.pop();
if(q1.x == || q1.y == || q1.x == m - || q1.y == n - ) {//达到出去条件, 输出到达此地步数+1
printf("%d\n", q1.step + );
return;
} for(int i = ; i < ; i++) {
e.x = q1.x + dir[i][];
e.y = q1.y + dir[i][];
e.step = q1.step + ;
if(c != ){
if(e.x >= && e.y >= && e.x < m && e.y < n && F[e.x][e.y] != - && e.step < F[e.x][e.y] && maps[e.x][e.y] == '.') {
F[e.x][e.y] = -;
q.push(e);
}
}
else if(e.x >= && e.y >= && e.x < m && e.y < n && F[e.x][e.y] != - && maps[e.x][e.y] == '.') {
F[e.x][e.y] = -;
q.push(e);
}
} } printf("IMPOSSIBLE\n");//未满足条件 } int main()
{
int T;
scanf("%d", &T);//T个样例 while(T--) {
Init();//初始化
int c = ;
scanf("%d %d", &m, &n);
for(int i = ; i < m; i++) {
scanf(" ");
for(int j = ; j < n; j++) {
scanf("%c", &maps[i][j]);
if(maps[i][j] == 'F') {//读入数据同时进行初始化 保存人和火焰的下标
a[c].x = i;
a[c].y = j;
a[c++].step = ;
}
if(maps[i][j] == 'J') {
s.x = i;
s.y = j;
s.step = ;
}
}
}
BFS(c);//开广搜 }
}
/*
2
4 4
####
#J.#
#..#
#..#
3 3
###
#J.
#.F
*/

UVA 11624 Fire!的更多相关文章

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

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

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

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

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

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

  4. UVA 11624 - Fire! 图BFS

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

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

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

  6. UVa 11624 Fire!(BFS)

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

  7. uva 11624 Fire!(搜索)

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

  8. UVA 11624 Fire! (bfs)

    算法指南白书 分别求一次人和火到达各个点的最短时间 #include<cstdio> #include<cstring> #include<queue> #incl ...

  9. (简单) UVA 11624 Fire! ,BFS。

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

  10. UVA 11624 Fire! bfs 难度:0

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

随机推荐

  1. linux 调用java main方法

    #!/bin/shexport LANG=zh_CNtimestamp=`date +%Y%m%d%H%M`/opt/java6/bin/java -Xms128m -Xmx512m -Dfile.e ...

  2. jQuery validation学习(1)验证只输入空格通过验证

    当input输入了空格是不会提示信息的 一般会去除空格然后进行验证 这个时候就要添加onkeyup事件去除左侧的空格 验证只输入空格通过验证 //添加验证手机方法 jQuery.validator.a ...

  3. IBM X3850 Windows 无法安装到这个磁盘。选中的磁盘具有MBR分区表。在 EFI 系统上,Windows 只能安装到 GPT 磁盘

    以前安装的是window2003 32位, 改装为2012 64位的时候.出现 Windows 无法安装到这个磁盘.选中的磁盘具有MBR分区表.在 EFI 系统上,Windows 只能安装到 GPT ...

  4. idea jrebel6 安装,破解

    一.Setting中在线安装JRebel插件,install 二.拷贝下载的jrebel.rar解压后 把里面内容覆盖IDEA插件安装目录中此插件目录之下 下载:http://pan.baidu.co ...

  5. 双模蓝牙CC2564调试笔记

    1.CC256X Testing Guide  官方文档WIKI地址:http://processors.wiki.ti.com/index.php/CC256x_Testing_Guide#Devi ...

  6. LaTeX用dvi编译,Yap浏览器弹出对话框,决解办法(傻瓜教程)

      1,打开windows-----所有运用,找到CTEX的文件目录 2,打开Previewer对话框 打开后如图: 2,选择view – option 打开后如下图: 3,选择Display---- ...

  7. codeforces 744C Hongcow Buys a Deck of Cards

    C. Hongcow Buys a Deck of Cards time limit per test 2 seconds memory limit per test 256 megabytes in ...

  8. Grunt_1从安装开始创建一个基本的Grunt

    Grunt的介绍:http://www.gruntjs.net/getting-started 文件架构:https://github.com/zhangsai521314/Grunt 1:安装Git ...

  9. font-weight -- 定义字体的粗细

    font-weight -- 定义字体的粗细 取值: normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 70 ...

  10. js加密解密

    <script> document.write("<xmp>"); document.write(function(p,a,c,k,e,r){}(''.sp ...