Uvaoj 11624 - Fire!
/*************************************************************************
> File Name: test.cpp
> Author: HJZ
> Mail: 2570230521@qq.com
> Created Time: 2014年08月03日 星期日 07时26分58秒
************************************************************************/ /*
题目大意:一个人joe想从迷宫中逃脱,但是迷宫中有着火的地方!joe每分钟向上下左右其中一个方向走一步,当然有火的地方和有墙的地方是不能通过的!
另外,火的蔓延的方向是同一时刻向上下左右四个方向蔓延! 思路:每一时刻,先将火的蔓延位置标记出来,并将新的火的位置放入队列qf中;
因为某一时刻,我们将所有joe可能走的路径都放入了队列中了,假如t1时刻他能走的位置是5个,那么在t1+1时刻,根据上一时刻t1的可能位置更新t1+1
时刻的可能位置,t1时刻的位置出队列q, t1+1时刻的新位置并重新进入队列!
*/ #include <queue>
#include <string>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <iomanip>
#include<cmath>
#include <algorithm>
#include<queue>
#define M 1005
#define mem(a) (memset((a), 0, sizeof(a)))
#define get(s) fgets(s, sizeof(s)-1, stdin) using namespace std; char map[M][M];
int n, m;
int bg, ed;
int dir[][]={, , , , -, , , -}; struct Point{
int x, y, step;
Point(){ }
Point(int x, int y, int step){
this->x=x;
this->y=y;
this->step=step;
}
};
queue<Point>q; queue<Point>qf;
int cntF;//某一时刻,火点的位置进入队列的个数
int cntP;//某一时刻,joe可走位置进入队列的个数 int bfs(){
while(!q.empty()) q.pop();
q.push(Point(bg, ed, ));
while(){
while(!qf.empty() && cntF){
Point Fcur=qf.front();
qf.pop();
--cntF;
int x=Fcur.x, y=Fcur.y;
for(int i=; i<; ++i){
int xx=x+dir[i][];
int yy=y+dir[i][];
if(map[xx][yy]!='F' && map[xx][yy]!='#'){
map[xx][yy]='F';
qf.push(Point(xx, yy, ));
}
}
}
cntF=qf.size();
while(!q.empty() && cntP){
Point cur=q.front();
q.pop(); --cntP; int x=cur.x, y=cur.y;
if(x== || x==n || y== || y==m) return cur.step;
for(int i=; i<; ++i){
int xx=x+dir[i][];
int yy=y+dir[i][];
if(map[xx][yy]!='#' && map[xx][yy]!='F' && map[xx][yy]!='X'){
map[xx][yy]='X';
if(x== || x==n || y== || y==m) return cur.step+;
q.push(Point(xx, yy, cur.step+)); } } }
cntP=q.size();
if(cntP==) return -;
}
return -;
} int main(){
int t;
scanf("%d", &t);
while(t--){
scanf("%d%d", &n, &m);
for(int i=; i<=n+; ++i)
map[i][]=map[i][m+]='#';
for(int i=; i<=m+; ++i)
map[][i]=map[n+][i]='#'; while(!qf.empty()) qf.pop();
cntF=;
cntP=;
for(int j=, i=; i<=n; ++i){
scanf("%s", map[i]+);
for(j=; j<=m; ++j)
if(map[i][j]=='J'){
bg=i;
ed=j;
}
else if(map[i][j]=='F'){
++cntF;
qf.push(Point(i, j, ));
}
map[i][j]='#';
} int tt=bfs();
if(tt!=-)
printf("%d\n", tt);
else printf("IMPOSSIBLE\n");
}
return ;
}
Uvaoj 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!(广度优先搜索)
题目大意:在一个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)
算法指南白书 分别求一次人和火到达各个点的最短时间 #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】
Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the owner of the m ...
- UVA - 11624 Fire! 【BFS】
题意 有一个人 有一些火 人 在每一秒 可以向 上下左右的空地走 火每秒 也会向 上下左右的空地 蔓延 求 人能不能跑出来 如果能 求最小时间 思路 有一个 坑点 火是 可能有 多处 的 样例中 只有 ...
随机推荐
- JAVA设计模式--抽象工厂模式
抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...
- 第52讲:Scala中路径依赖代码实战详解
今天学习了scala中的路径依赖,来看一下实战代码 class Outer{ private val x = 10 class Inner{ private val y = x +10 } ...
- C++学习心得
从大一的学习中,我了解到C++是兼容C的面向过程和面向对象的程序设计语言.其中,面向对象程序设计方法是以对象为模板的结构化程序设计方法,是对结构化程序设计方法的继承和发展.刚开始的学习让我觉得特别吃力 ...
- Linux内核--网络栈实现分析(八)--应用层发送数据(下)
本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7547826 更多请查看专栏,地 ...
- mongodb(回滚)
事实上mongodb是不支持事务的,个人理解原因如下:1.避免大量对document加锁,从而影响性能,2.非关系型的数据库,从设计上就应能尽可能的比较关联复杂的多document,一个数据应能记录在 ...
- UDP Client—Linux
#include <stdio.h> #include <netinet/ip.h> int main(int argc,char *argv[]) { #define PER ...
- 使用Guava提供的filter过滤集合
正常情况下,我们声明一个List需要如下代码 List<String> list = new ArrayList<>(); list.add("AAA"); ...
- 用DirectX实现魔方(三)视角变换及缩放(附源码)
在本系列第一篇介绍过鼠标按键的功能,如下. 左键拖拽 - 旋转魔方 右键拖拽 - 变换视角 滚轮 - 缩放魔方 今天研究一下如何实现后面两个功能,用到的技术主要是Arcball,Arcball是实现M ...
- Identity自增序列/唯一断标识
ThreadStatic应用(Identity补完) 用于在高并发环境中的自增序列维护和快速创建唯一不重复的短标识,该类是线程安全的 如在ORM组件中,创建唯一的参数名 特点: 高并发环境下的性能保证 ...
- 在github上写个人简历——先弄个主页
起因 不知道园友们在使用智联招聘等网站填写简历的时候对要求输入的内容有没有一种无力感,不吐槽了反正就一句话,按照它提供的格式我没法儿写简历,而且面试的时候总会被问道有没有自己作品,哥们儿天天上班,下班 ...