uva11624 Fire! (bfs预处理)
题目链接:https://vjudge.net/problem/UVA-11624
题意:给一个1000×1000的矩阵,有几个着火点和Joe,着火点和Joe每个单位时间均移动一个单位,求Joe逃出的最短时间。
思路:
先预处理,对每一个Fire进行一次bfs,更新cnt[i][j],它表示(i,j)的着火时间,注意多个Fire能到达(i,j)时要使cnt[i][j]最小,并且该bfs中的判断语句if(cnt[xx][yy]<=ss) continue能够避免走重复的路径,因此不用标记数组。得到cnt数组后,再对Joe进行一次bfs即可,需要标记数组vis。
AC代码:
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std; typedef pair<int,int> PII;
const int inf=0x3f3f3f3f;
int go[][]={-,,,,,,,-};
int T,n,m,jx,jy,cnt[][],vis[][];
char mp[][];
vector<PII> vc; struct node{
int x,y,s;
}tmp; void bfs1(int x,int y){
queue<node> que;
cnt[x][y]=;
tmp.x=x,tmp.y=y,tmp.s=;
que.push(tmp);
while(!que.empty()){
node now=que.front();que.pop();
int nx=now.x,ny=now.y,ns=now.s;
for(int i=;i<;++i){
int xx=nx+go[i][],yy=ny+go[i][],ss=ns+;
if(xx<=||xx>n||yy<=||yy>m||mp[xx][yy]=='#') continue;
if(cnt[xx][yy]<=ss) continue;
cnt[xx][yy]=ss;
tmp.x=xx,tmp.y=yy,tmp.s=ss;
que.push(tmp);
}
}
} bool onborder(int x,int y){
return x==||x==n||y==||y==m;
} int bfs2(int x,int y){
queue<node> que;
tmp.x=x,tmp.y=y,tmp.s=;
que.push(tmp);
vis[x][y]=;
while(!que.empty()){
node now=que.front();que.pop();
int nx=now.x,ny=now.y,ns=now.s;
if(onborder(nx,ny)) return ns+;
for(int i=;i<;++i){
int xx=nx+go[i][],yy=ny+go[i][],ss=ns+;
if(xx<=||xx>n||yy<=||yy>m||mp[xx][yy]=='#') continue;
if(vis[xx][yy]) continue;
if(cnt[xx][yy]<=ss) continue;
vis[xx][yy]=;
tmp.x=xx,tmp.y=yy,tmp.s=ss;
que.push(tmp);
}
}
return -;
} int main(){
scanf("%d",&T);
while(T--){
vc.clear();
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)
for(int j=;j<=m;++j){
cnt[i][j]=inf;
vis[i][j]=;
scanf(" %c",&mp[i][j]);
if(mp[i][j]=='J') jx=i,jy=j;
if(mp[i][j]=='F') vc.push_back(make_pair(i,j));
}
for(int i=;i<vc.size();++i)
bfs1(vc[i].first,vc[i].second);
int t=bfs2(jx,jy);
if(t==-)
printf("IMPOSSIBLE\n");
else
printf("%d\n",t);
}
return ;
}
uva11624 Fire! (bfs预处理)的更多相关文章
- UVA11624 Fire! —— BFS
题目链接:https://vjudge.net/problem/UVA-11624 题解: 坑点:“portions of the maze havecaught on fire”, 表明了起火点不唯 ...
- BZOJ-1189 紧急疏散evacuate BFS预处理+最大流+二分判定+神建模!!
绝世污题,垃圾题,浪费我一整天青春! 1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1262 ...
- uva11624 - Fire!
uva11624 - Fire! 火在蔓延,人在走.火会蔓延,不会熄灭,我们可以确定某个点着火的时间(广搜).对于J来说,要是他走到某点的时间比火蔓延到该点的时间要短,那么他走到该点的时候,火还没蔓延 ...
- HDU - 1430 魔板 (bfs预处理 + 康托)
对于该题可以直接预处理初始状态[0, 1, 2, 3, 4, 5, 6, 7]所有可以到达的状态,保存到达的路径,直接打印答案即可. 关于此处的状态转换:假设有初始状态为2,3,4,5,0,6,7,1 ...
- 【2016 ICPC亚洲区域赛北京站 E】What a Ridiculous Election(BFS预处理)
Description In country Light Tower, a presidential election is going on. There are two candidates, ...
- HDU 3533 Escape(BFS+预处理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3533 题目大意:给你一张n* m的地图,人在起点在(0,0)要到达终点(n,m)有k(k<=10 ...
- bzoj 1415(概率dp和bfs预处理)
感觉挺经典的一道题目. 先用 bfs 预处理下一步走到的位置.因为每一步走法都是固定的,所以可以用dp的方法来做. 1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec M ...
- Fire! (双bfs+预处理)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- HDU 1430 魔板(康托展开+BFS+预处理)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
随机推荐
- ckeditor实现ctrl+v粘贴word图片并上传
官网地址http://ueditor.baidu.com Git 地址 https://github.com/fex-team/ueditor 参考博客地址 http://blog.ncmem.com ...
- 牛客练习赛53 (E 老瞎眼 pk 小鲜肉) 线段树+离线
考试的时候切的,类似HH的项链~ code: #include <bits/stdc++.h> #define ll long long #define M 500003 #define ...
- Gradle 如何配置将编译的 JAR 发布到 Archiva 中
有时候我们希望将我们的jar 开发包发布到 Archiva 中. 如何配置 Gradle 的编译脚本呢? 首先你需要启用 Gradle 的 Maven-publish 插件. plugins { id ...
- Windows Storage 驱动开发 葵花宝典 - 翻译
Roadmap for Developing Windows Storage Drivers Last Updated: 4/20/2017 To create a storage driver, ...
- Python流程控制和缩进
我们语文学写作文,有如果- -,那么- -的句式,同样Python也有这样的句式: #如何这个条件成立了,那就执行下面这个语句 if 条件: 内容1 内容2 else: 内容3 几点说明:
- 修改history记录数
在linux系统下.history命令会保存多少条命令呢?曾在一本书上说,如果注销系统,那么会将所有的历史命令都定入到~/.bash_history, 但只保留1000条命令(这个是由默认的shell ...
- ACM之路(12)—— KMP & 扩展KMP & Manacher
最近做完了kuangbin的一套关于kmp的题目(除了一道字典树的不会,因为还没学字典树所以先放放),做个总结.(kuangbin题目的链接:http://acm.hust.edu.cn/vjudge ...
- Java中RuntimeException和Exception
在java的异常类体系中,Error和RuntimeException是非检查型异常,其他的都是检查型异常. 所有方法都可以在不声明throws的情况下抛出RuntimeException及其子类 不 ...
- oracle清除归档
清除Oracle归档日志命令echo -e 'delete noprompt archivelog ALL COMPLETED BEFORE '\'SYSDATE-${DELETE_ARCHIVELO ...
- Windows使用Vagrant&VirtualBox搭建虚拟开发环境
Vagrant 是一款用来构建虚拟开发环境的工具 , 我们可以通过 Vagrant 封装一个 Linux 的开发环境 , 分发给团队成员 ; 成员可以在自己喜欢的桌面系统 Mac/Windows/Li ...