题目大意:

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. 表单 阻止 技巧 JavaScript js

    阻止表单的提交,可以用return false 来进行阻止 长度不低于6,不高于20 if(username.length < 6 || username>20){ alert (&quo ...

  2. [原]在AMD机器上使用android studio

    amd机器上使用android studio进行调试.因为amd的cpu不支持IntelVT,所以可能会有如下错误提示   我们有几个选择: 1. 使用真机调试 2. 配合genymotion 3. ...

  3. Bootstrap 3 Datepicker 使用过程

    最近在创建记录的时候,需要用到日历的功能.本身是使用的bootstrap布局的,所以就找到Datepicker,看了一下用起来还是挺方便的.下面就是使用过程. 依赖的资源 jQuery Moment. ...

  4. inline、block、inline-block的区别

    http://www.cnblogs.com/KeithWang/p/3139517.html

  5. selenium-JS点击(项目应用)

    public static JavascriptExecutor jse; 声明一个js public LogoutWebElements(WebDriver driver){        Logo ...

  6. JITComVCTK无法访问

    源代码第一次加载时会遇到JITComVCTK无法访问的问题,这是因为没有注册该第三方插件,需要到文件夹"\CommonFiles\dll\JITComVCTK"下注册,具体方式: ...

  7. linux开发缩写

    1.CONFIG_OF 在一些驱动中经常看到#ifdef CONFIG_OF,这里的OF是Open Firmware. Open Firmware. This was invented long ti ...

  8. jq

    1: http://jquery.cuishifeng.cn/index.html jquery 学习查询首页<br> 2: http://m.oschina.net/blog/75741 ...

  9. UVA Open Credit System Uva 11078

    题目大意:给长度N的A1.....An 求(Ai-Aj)MAX 枚举n^2 其实动态维护最大值就好了 #include<iostream> #include<cstdio> u ...

  10. About next_permutation

    哈哈没错这个又是我们C++党的语言优势之一,用这个函数可以求当前排序的下一个排序,也就是说可以方便的求全排列,用这个函数需要用到algorithm这个头文件. 与这个函数相反的是prev_permut ...