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

氺题不多说,直接预处理每个点的起火时间,然后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. Python之时间模块、random模块、json与pickle模块

    一.时间模块 1.常用时间模块 import time # 时间分为三种格式 #1.时间戳---------------------以秒计算 # start= time.time() # time.s ...

  2. Linu之linux系统基础优化和基本命令

    Linux系统基础优化和基本命令 网络参数设定命令 ifconfig: 查询,设置网卡和ip等参数 ifup,ifdown: 脚本命令,更简单的方式 ip: 符合指令,直接修改上述功能 编辑网卡配置文 ...

  3. 流行创意风格教师求职简历免费word模板

    18款流行创意风格教师求职简历免费word模板,也可用于其他专业和职业,个人免费简历模板,个人简历表免费,个人简历表格. 声明:该简历模板仅用于个人欣赏使用,请勿用于商业用途,谢谢. 下载地址:百度网 ...

  4. javaweb学习6——自定义标签

    声明:本文只是自学过程中,记录自己不会的知识点的摘要,如果想详细学习JavaWeb,请到孤傲苍狼博客学习,JavaWeb学习点此跳转 本文链接:https://www.cnblogs.com/xdp- ...

  5. python破解网吧收费系统,远控网吧电脑设备!

      我今天呢 , 我就没事跟着朋友喝酒喝酒啊.喝了很多啊.晚上到旁边的酒店开了一个房间,到了酒店才十点! 感觉没啥事情干的,那就去网吧走走看把,看到是一个嘟嘟牛的,和上次是一样的.还是照常用MS170 ...

  6. Netty源码分析第3章(客户端接入流程)---->第5节: 监听读事件

    Netty源码分析第三章: 客户端接入流程 第五节: 监听读事件 我们回到AbstractUnsafe的register0()方法: private void register0(ChannelPro ...

  7. "api-ms-win-crt-runtime-l1-1-0.dll 丢失"怎么办?详细解决步骤

    api-ms-win-crt-runtime-l1-1-0.dll 丢失 电脑找不到api-ms-win-crt-runtime-l1-1-0.dll文件解决方法: 问题描述: 1.开机提示" ...

  8. TensorFlow --- 01初识

    由于博客园对Markdown支持不够友好,阅读此文请前往云栖社区:TensorFlow --- 01初识

  9. 关于java内存泄露的总结--引用的类型:强引用,弱引用,软引用

    今天面试了一家公司的java开发方面的实习生,被问到一个问题:如何处理java中的内存泄露问题,保证java的虚拟机内存不会被爆掉,当时其实觉得面试官的问题有点泛,所以也没有很好领会他的意思,答案也不 ...

  10. resize2fs命令详解

    基础命令学习目录首页 原文链接:http://blog.51cto.com/woyaoxuelinux/1870299   resize2fs:调整ext文件系统的空间大小  搭配逻辑卷lv使用方法: ...