UVA 11624 Fire!
题目大意:
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!的更多相关文章
- UVa 11624 Fire!(着火了!)
UVa 11624 - Fire!(着火了!) Time limit: 1.000 seconds Description - 题目描述 Joe works in a maze. Unfortunat ...
- BFS(两点搜索) UVA 11624 Fire!
题目传送门 /* BFS:首先对火搜索,求出火蔓延到某点的时间,再对J搜索,如果走到的地方火已经烧到了就不入队,直到走出边界. */ /******************************** ...
- UVA - 11624 Fire! bfs 地图与人一步一步先后搜/搜一次打表好了再搜一次
UVA - 11624 题意:joe在一个迷宫里,迷宫的一些部分着火了,火势会向周围四个方向蔓延,joe可以向四个方向移动.火与人的速度都是1格/1秒,问j能否逃出迷宫,若能输出最小时间. 题解:先考 ...
- UVA 11624 - Fire! 图BFS
看题传送门 昨天晚上UVA上不去今天晚上才上得去,这是在维护么? 然后去看了JAVA,感觉还不错昂~ 晚上上去UVA后经常连接失败作死啊. 第一次做图的题~ 基本是照着抄的T T 不过搞懂了图的BFS ...
- UVA 11624 Fire!(广度优先搜索)
题目大意:在一个N*M的迷宫内,J代表某人(只有一个),F代表火(可能不只一个),#代表墙,火每分钟会向四周除了墙以外的地方扩散一层,问人能否在没被火烧到 之前逃出迷宫,若能逃出输出最短时间.很明显的 ...
- UVa 11624 Fire!(BFS)
Fire! Time Limit: 5000MS Memory Limit: 262144KB 64bit IO Format: %lld & %llu Description Joe ...
- uva 11624 Fire!(搜索)
开始刷题啦= = 痛并快乐着,学到新东西的感觉其实比看那些无脑的小说.电视剧有意思多了 bfs裸体,关键是先把所有的着火点放入队列,分开一个一个做bfs会超时的 发现vis[][]是多余的,完全可以用 ...
- UVA 11624 Fire! (bfs)
算法指南白书 分别求一次人和火到达各个点的最短时间 #include<cstdio> #include<cstring> #include<queue> #incl ...
- (简单) UVA 11624 Fire! ,BFS。
Description Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the ow ...
- UVA 11624 Fire! bfs 难度:0
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
随机推荐
- Python 对目录中的文件进行批量转码(GBK>UTF8)
通过python实现对文件转码,其实处理很简单: 1.打开读取文件内容到一个字符串变量中,把gbk编码文件,对字符串进行decode转换成unicode 2.然后使用encode转换成utf-8格式. ...
- CentOS 安装 Dubbo 管理控制台
安装之前需要安装zookeeper详情http://www.cnblogs.com/zuge/p/6141101.html Dubbo 管控台可以对注册到 zookeeper 注册中心的服务或服务消费 ...
- Android 进程常驻----native保活5.0以上方案推演过程以及代码
正文: 上一篇我们通过父子进程间建立双管道,来监听进程死掉,经过测试,无耗电问题,无内存消耗问题,可以在设置中force close下成功拉起,也可以在获取到root权限的360/cleanmaste ...
- 平时一些mysql小技巧及常识
>navicat premium 快捷键1.ctrl+q 打开查询窗口2.ctrl+/ 注释sql语句3.ctrl+shift +/ 解除注释4.ctrl+r 运行查询窗口的sql语句5.ctr ...
- C#中浮点数依IEEE-754标准转二进制串 (MODBUS 浮点数转换)
因工作需要,把再串口通信中浮点数与字节流的数据转换函数放在这,转发的,谢谢原作者. 今天花了一天的时间搜罗资料,为了解决一个串口编程的进制转化问题.因为串口传送的浮点数据格式与IEEE-754标准(3 ...
- CentOS 7 最小化安装的无线网络配置
1.首先下载iw工具. yum -y install iw 2.获取无线网卡的名称 执行iw dev,假设获得名称为 wlp3s0(示例) 3.激活无线网络接口 执行ip link set wlp3s ...
- webpack配置命令
从2015年开始,webpack就是当前最火的构建工具.跟着时代向前走.准没错.我们要追随大神的脚步.走在前端技术栈的前列.大神等等我. 由于webpack是基于nodejs环境下的.所以先安装nod ...
- 剑指offer五:
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. /* public class ListNode { int val; ListNode next = n ...
- PCA9554
参考资料: 1. Texas Instruments PCA9554简介 2. PCA9554文档下载 3. PCA9554 Data Sheet 知识点: ● PCA9554是具有中断输出和配置寄存 ...
- 【所见即所得】textarea 精确限制字数、行数,中、英、全半角混检 。源码带注释
主要解决难点: 1 中文 全角2字符深深的恶意 2 多行输入textarea 手动,自动换行问题 3 获得每行内容 原创,转载请注明出处! <!DOCTYPE html PUBLIC " ...