在一个矩形方阵里面,一个人要从一个位置走向另一个位置,其中某些地方有火源,每过一分钟,火源就会点燃相邻的点,同时相邻的点也变成了火源。人不能通过有火的点。问一个人能够安全地走到目的地去?最短时间多少?

氺题不多说,直接预处理每个点的起火时间,然后bfs即可。

召唤代码君:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#define maxn 1010
using namespace std; char s[maxn][maxn];
int g[maxn][maxn];
int T,n,m;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0}; bool inside(int cx,int cy)
{
return cx>0 && cx<=n && cy>0 && cy<=m;
} bool border(int cx,int cy)
{
return cx==1 || cx==n || cy==1 || cy==m;
} void init_fire()
{
for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++) g[i][j]=99999999;
queue<int> qx,qy;
for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++)
if (s[i][j]=='F') qx.push(i),qy.push(j),g[i][j]=0;
while (!qx.empty())
{
int cx=qx.front(),cy=qy.front();
qx.pop(),qy.pop();
for (int i=0; i<4; i++)
{
if (!inside(cx+dx[i],cy+dy[i])) continue;
if (s[cx+dx[i]][cy+dy[i]]!='.') continue;
if (g[cx][cy]+1>=g[cx+dx[i]][cy+dy[i]]) continue;
g[cx+dx[i]][cy+dy[i]]=g[cx][cy]+1;
qx.push(cx+dx[i]),qy.push(cy+dy[i]);
}
}
} int bfs()
{
queue<int> qx,qy;
for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++)
if (s[i][j]=='J')
{
g[i][j]=0;
qx.push(i),qy.push(j);
if (border(i,j)) return 1;
}
while (!qx.empty())
{
int cx=qx.front(),cy=qy.front();
qx.pop(),qy.pop();
for (int i=0; i<4; i++)
{
if (s[cx+dx[i]][cy+dy[i]]!='.') continue;
if (g[cx][cy]+1>=g[cx+dx[i]][cy+dy[i]]) continue;
if (border(cx+dx[i],cy+dy[i])) return g[cx][cy]+2;
g[cx+dx[i]][cy+dy[i]]=g[cx][cy]+1;
qx.push(cx+dx[i]),qy.push(cy+dy[i]);
}
}
return -1;
} int main()
{
scanf("%d",&T);
while (T--)
{
scanf("%d%d",&n,&m);
for (int i=1; i<=n; i++) scanf("%s",s[i]+1);
init_fire();
int ans=bfs();
if (ans==-1) puts("IMPOSSIBLE");
else printf("%d\n",ans); }
return 0;
}

  

UVA11624_Fire!的更多相关文章

随机推荐

  1. ant property file刷新不及时

    一.问题 ant脚本定义file的property,有时往里面写了新的值,去访问时还是旧的值 二.原因分析 应该是已定义的file property,后续更新其值的时候,ant的内存缓存没有及时更新, ...

  2. c# 缓存详解

    如果说要对一个站点或者应用程序经常优化,可以说缓存的使用是最快也是效果最明显的方式.一般而言,我们会把一些常用的,或者需要花费大量的资源或时间而产生的数据缓存起来,使得后续的使用更加快速. 如果真要细 ...

  3. 取消Ubuntu18.04开机输入密码登录

    设置>>详细信息>>用户>>解锁>>(输入密码进行认证)>>{自动登录}选项打开

  4. 用人工智能学习,凡亿推出PCB问题解答智能搜索机器人:pcb助手

    对于学习者,你是不是经常遇到这样的问题:在我们狠狠下定决心学习PCB技术的时候,我们常常遇到很多大大小小的问题,遗憾的是身边没有一个能及时给自己解答问题的高手指点,通过论坛.群等方式询问可能半天也得不 ...

  5. centos7搭建ANT+jmeter+jenkins接口测试自动化环境

    一.环境准备 因为用到了jmeter和apache-tomcat,centos7必须要有java环境,所以配置jdk和apache-tomcat什么的,就不多说了,自行操作 帮你们偷懒: ant下载地 ...

  6. fiddler和bugfree之间的联动(做伪请求、伪响应、并发、抓密码)

    青.取之于蓝,而青于蓝:冰.水为之,而寒于水 不积跬步,无以至千里;不积小流,无以成江海. 1解压Fiddler Web Debugger V4.6.2017修正中文第6版至C盘Program Fil ...

  7. CF刷题-Codeforces Round #481-F. Mentors

    题目链接:https://codeforces.com/contest/978/problem/F 题目大意: n个程序员,k对仇家,每个程序员有一个能力值,当甲程序员的能力值绝对大于乙程序员的能力值 ...

  8. jar包、war包

    JavaSE程序可以打包成Jar包(J其实可以理解为Java了),而JavaWeb程序可以打包成war包(w其实可以理解为Web了).然后把war发布到Tomcat的webapps目录下,Tomcat ...

  9. Cocos2d-x的跨平台原理

    为了充分发挥硬件性能,手机游戏通常使用Native App开发模式,这就造成开发商要为iOS 和Android平台用户开发不同的应用,无论是产品迭代还是运行维护都非常麻烦.Cocos2d-x在iOS, ...

  10. Python处理PDF和Word文档常用的方法

    Python处理PDF和Word文档的模块是PyPDF2,使用之前需要先导入. 打开一个PDF文档的操作顺序是:用open()函数打开文件并用一个变量来接收,然后把变量给传递给PdfFileReade ...