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】
题意 有一个人 有一些火 人 在每一秒 可以向 上下左右的空地走 火每秒 也会向 上下左右的空地 蔓延 求 人能不能跑出来 如果能 求最小时间 思路 有一个 坑点 火是 可能有 多处 的 样例中 只有 ...
随机推荐
- 《TCP/IP高效编程:改善网络程序的44个技巧》源码在Linux上的编译
为了先完整编译通过,需要以下几个步骤: 1.进入linux子目录,执行 make.(此步骤为打补丁.) 2.返回上一级目录,打开文件 simplec.c,添加头文件 #include <stdi ...
- JDK6环境下升级项目到springframework4.x和tomcat7.x
springframework 3.x升级到 4.x 1 xsi:schemaLocation 对应的3.x->4.x 2 pom springframework <propertie ...
- Extjs的学习及MIS系统实践应用(系列文章)
本系列文章从Extjs的实际运用出发,结合系统开发的实践经验,详细解释Extjs的基本控件及控件扩展的用法,和在平时的学习运用中一步一步查阅的资料.积累经验的集锦.标题及链接奉上,用一个小程序,开启了 ...
- 关于网页pc端以及移动端的兼容性——测试
对于经常做网页设计的人员来说,网页的兼容性测试是不可缺少的,记得刚来单位的新手,都是要安装一款浏览器测试软件的,看自己制作的网页是否在各大浏览器中正常显示,有没有变形,或者网页效果不兼容等. 不仅仅是 ...
- cocoapods安装以及使用,安装过程中ruby版本过低
cocoapods安装以及使用,安装过程中ruby版本过低 字数473 阅读103 评论1 喜欢2 1.打开终端 2.移除现有 Ruby 默认源 $ gem sources --remove http ...
- java上传图片或者文件
package com.pat.postrequestemulator; import java.io.BufferedReader; import java.io.DataInputStream; ...
- 找回忘记的Ubuntu用户名和密码
找回忘记的Ubuntu用户名和密码 前端时间使用VMWare安装了个Ubuntn的虚拟机,但是烦于安装后显卡驱动的问题,看着操作界面就有点厌烦,就扔下了.今天打开虚拟机登陆的时候忘了密码,寻思着难道要 ...
- Centos6.6下安装MariaDB步骤,利用yum进行安装
1.在/etc/yum.repos.d/下建立MariaDB.repo文件 可以在Win下编辑好此文件,然后通过SSH远程复制过去. 2.MariaDB.repo内容要根据MariaDB官方提供的re ...
- C# WPF获取任务栏时间区域的Rectangle
[StructLayout(LayoutKind.Sequential)] public struct WindowRect { public int left; public int top; pu ...
- css实现左栏固定右栏自适应,高度自适应的布局
收集css中的基础知识,所以这并不是什么新鲜的技术,只是作为备忘~本文的内容如题所示,是一个简单的布局,用于左右两栏布局的页面,左侧是固定宽度,右侧占据剩余的宽度.在垂直方向,始终以高度最大的一栏为基 ...