【无标题】

一个迷宫可以看作一个 R 行 C 列的方格矩阵。

其中一些方格是空地,用 . 表示,其他方格是障碍,用 # 表示。

开始时,乔位于一块空地之中。

迷宫中一些空地已经起火了,幸运的是火还没有蔓延至乔所在的位置。

为了避免被火烧伤,乔需要尽快逃离迷宫。

已知,乔每单位时间只能沿上下左右四个方向前进一格距离,并且在前进过程中,他不能进入障碍方格。

火每单位时间都会蔓延至其上下左右四个方向的相邻空地,但是火也会被障碍阻挡。

如果一个方格已经起火或者会在乔进入方格的那一时刻恰好起火,则该方格很危险,乔不能进入。

当乔进入到任意一个位于边界的空地方格时,他都可以再花费一单位时间,直接逃离迷宫。

请问,乔想要逃离迷宫,最少需要花费的时间。

输入格式

第一行包含整数 T,表示共有 T 组测试数据。

每组数据第一行包含两个整数 R,C。

接下来 R 行,包含一个 R×C 的字符矩阵。

矩阵中只包含以下四种字符:

  • # 表示障碍方格。
  • . 表示空地方格。
  • J 表示乔所在的空地方格,最多只有一个。
  • F 表示已经起火的空地方格。

输出格式

每组数据输出一行结果,一个整数表示逃离迷宫所需花费的最少时间,如果无法逃离迷宫,则输出 IMPOSSIBLE

数据范围

1≤T≤10
1≤R,C≤1000。

输入样例:

2
4 4
####
#JF#
#..#
#..#
3 3
###
#J.
#.F

输出样例:

3
IMPOSSIBLE

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
#include <set>
#include <map>
#include <stack>
using namespace std;
#define x first
#define y second

using namespace std;

typedef pair<int, int> PII;

const int N = 1010, INF = 0x3f3f3f3f;

int n, m;
char g[N][N];
int d[N][N], w[N][N];
vector<PII> fire;

void bfs()
{
    queue<PII> q;
    int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};

    for (auto& [x, y] : fire)
        q.push({x, y}), d[x][y] = 0;

    while (q.size())
    {
        PII t = q.front();
        q.pop();

        for (int i = 0; i < 4; i ++ )
        {
            int a = t.x + dx[i], b = t.y + dy[i];
            if (a < 1 || a > n || b < 1 || b > m) continue;
            if (d[a][b] != INF || g[a][b] != '.') continue;
            d[a][b] = d[t.x][t.y] + 1;
            q.push({a, b});
        }
    }

}

int BFS(int sx, int sy)
{
    if (sx == 1 || sx == n || sy == 1 || sy == m) return 1;
    queue<PII> q;
    int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
    q.push({sx, sy});
    w[sx][sy] = 0;

    while (q.size())
    {
        PII t = q.front();
        q.pop();

        for (int i = 0; i < 4; i ++ )
        {
            int a = t.x + dx[i], b = t.y + dy[i];
            if (a < 1 || a > n || b < 1 || b > m) continue;
            if (w[a][b] != INF|| g[a][b] != '.' || w[t.x][t.y] + 1 >= d[a][b]) continue;
            w[a][b] = w[t.x][t.y] + 1;
            if (a == 1 || a == n || b == 1 || b == m) return w[a][b] + 1;
            q.push({a, b});
        }

    }

    return -1;
}

int main()
{

    int T;
    cin >> T;

    while (T -- )
    {
        cin >> n >> m;

        for (int i = 1; i <= n; i ++ ) cin >> g[i] + 1;

        fire.clear();
        memset(d, 0x3f, sizeof d);
        memset(w, 0x3f, sizeof w);

        for (int i = 1; i <= n; i ++ )
            for (int j = 1; j <= m; j ++ )
                if (g[i][j] == 'F') fire.push_back({i, j});

        bfs();

        for (int i = 1; i <= n; i ++ )
            for (int j = 1; j <= m; j ++ )
                if (g[i][j] == 'J')
                {
                    int res = BFS(i, j);

                    if (res == -1) puts("IMPOSSIBLE");
                    else cout << res << endl;
                    break;
                }
    }

    return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/4094.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电子招标采购系统:营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展

营造全面规范安全的电子招投标环境&#xff0c;促进招投标市场健康可持续发展 传统采购模式面临的挑战 一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标…

Google巨大漏洞让Win10、11翻车,小姐姐马赛克白打了

早年间电脑截图这项技能未被大多数人掌握时&#xff0c;许多人应该都使用过手机拍屏幕这个原始的方式。 但由于较低的画面质量极其影响其他用户的观感&#xff0c;常常受到大家的调侃。 但到了 Win10、11 &#xff0c;预装的截图工具让门槛大幅降低。 WinShiftS 就能快速打开…

专业护眼灯什么牌子好?分享最专业护眼灯品牌排行

在日常生活中&#xff0c;照明灯具为人们提供了很多便利&#xff0c;但是对于长时间在灯光下用眼的学生跟办公族来说&#xff0c;容易导致用眼疲劳&#xff0c;甚至头晕等现象&#xff0c;所以现在普遍许多家庭都必备有护眼灯&#xff0c;能对眼睛起到缓解疲劳的作用&#xff0…

Docker安装Mysql集群(主从复制)

Docker安装Mysql集群(主从复制) 配置阿里云镜像 sudo vim /etc/docker/daemon.json插入如下镜像 {"registry-mirrors": ["https://sdiz8d27.mirror.aliyuncs.com"] }重启docker sudo systemctl daemon-reloadsudo systemctl restart docker保证images有…

python

好处 相对其他编程语言 比较简洁丰富的第三方库【做爬虫、机器学习、深度学习】 numpypandasmatplotlit用处 数据分析web开发游戏开发AI【比较广泛】安装部署python环境 1.官网下载python安装包【原生部署】 官网&#xff1a;python.org2.安装anaconda 1.自带python环境2.有丰富…

Mybatis-Plus进阶使用

一、逻辑删除 曾经我们写的删除代码都是物理删除。 逻辑删除&#xff1a;删除转变为更新 update user set deleted1 where id 1 and deleted0 查找: 追加 where 条件过滤掉已删除数据,如果使用 wrapper.entity 生成的 where 条件也会自动追加该字段 查找: select id,name,dele…

JConsole使用教程

JConsole是一个Java虚拟机的监控和管理工具&#xff0c;可以监控Java应用程序的内存使用、线程和类信息等。 以下是JConsole的使用教程&#xff1a; 1.启动JConsole JConsole是一个Java自带的工具&#xff0c;可以在bin目录下找到jconsole.exe文件。双击运行该文件即可启动JC…

正则表达式-元字符

文章目录一、正则表达式-元字符总结一、正则表达式-元字符 正则表达式 - 元字符 下表包含了元字符的完整列表以及它们在正则表达式上下文中的行为&#xff1a; 字符描述\将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如&#xf…

强人工智能时代,区块链还有戏吗?

最近很多人都在问我&#xff0c;ChatGPT 把 AI 又带火了&#xff0c;区块链和 Web3 被抢了风头&#xff0c;以后还有戏吗&#xff1f;还有比较了解我的朋友问&#xff0c;当年你放弃 AI 而选择区块链&#xff0c;有没有后悔&#xff1f;这里有一个小背景。2017 年初我离开 IBM …

银行数字化转型导师坚鹏:如何制定银行数字化转型年度培训规划

如何制定银行数字化转型年度培训规划 ——以推动银行数字化转型战略落地为核心&#xff0c;实现知行果合一课程背景&#xff1a; 很多银行都在开展银行数字化转型培训工作&#xff0c;目前存在以下问题急需解决&#xff1a; 缺少针对性的银行数字化转型年度培训规划 不清楚如…

Spring --- 声明式事务

一、JdbcTemplate 1.1、简介 Spring 框架对 JDBC 进行封装&#xff0c;使用 JdbcTemplate 方便实现对数据库操作 1.2、准备工作 ① 加入依赖 <dependencies><!-- 基于Maven依赖传递性&#xff0c;导入spring-context依赖即可导入当前所需所有jar包 --><depen…

openAi ChatGPT调用性能优化的一些小妙招

参考的demo:GitHub - ddiu8081/chatgpt-demo: A demo repo based on OpenAI API. 扭曲调教&#xff1a; openai提供的chat接口&#xff08;https://api.openai.com/v1/chat/completions&#xff09;由于其模型很大&#xff08;什么1750亿个参数啥的&#xff09;&#xff0c;单…

Redis之底层数据结构

一 Redis数据结构 Redis底层数据结构有三层意思&#xff1a; 从Redis本身数据存储的结构层面来看&#xff0c;Redis数据结构是一个HashMap。从使用者角度来看&#xff0c;Redis的数据结构是String&#xff0c;List&#xff0c;Hash&#xff0c;Set&#xff0c;Sorted Set。从…

Docker 镜像使用

目录 1、列出镜像列表 2、获取一个新的镜像 3、查找镜像 4、拖取镜像 5、删除镜像 6、创建镜像 a.更新镜像 b.构建镜像 设置镜像标签 当运行容器时&#xff0c;使用的镜像如果在本地中不存在&#xff0c;docker 就会自动从 docker 镜像仓库中下载&#xff0c;默认是从 …

现在大专生转IT可行吗?

当然可行的。 大专也是人&#xff0c;为什么不可以选择喜欢的专业学习&#xff0c;现在大学生遍地都是&#xff0c;学历已经不是限制你发展的因素了。有的人就是不擅长理论学习&#xff0c;更喜欢技术。IT也只是一个普普通通的技术行业&#xff0c;跟其他技术行业一样&#xf…

wsl=

安装wsl wsl --install,用户名wu,密码 123456&#xff0c; https://learn.microsoft.com/en-us/windows/wsl/install 安装anaconda, 把anaconda移动到wu目录下&#xff0c;在wu用户以及用户目录下执行bash Anaconda-文件名&#xff0c;安装目录为/home/wu/anaconda3 配置cond…

C#方法详解

总目录 文章目录总目录前言一、方法概述1、方法签名2、调用/访问方法/方法形参与实参二、扩展方法1.实现扩展方法2、扩展方法调用3、优先级问题4、其他扩展方法示例1.获得枚举的Description2.其他常用扩展方法三、方法参数列表详解1、可选自变量&#xff08;可选参数&#xff0…

深入剖析 MVC 模式与三层架构

文章目录1. 前言2. MVC模式3. 三层架构4. MVC和三层架构5. 总结5.1 IDEA 小技巧1. 前言 前面我们探讨了 JSP 的使用&#xff0c;随着计算机技术的不断更新迭代&#xff0c;JSP 的技术由于存在很多的缺点&#xff0c;已经逐渐退出了历史的舞台&#xff0c;所以在学习时&#xf…

Google代码覆盖率最佳实践

软件质量保障: 所寫即所思&#xff5c;一个阿里质量人对测试的所感所悟。谷歌一直倡导的领域之一是使用代码覆盖率数据评估风险并识别测试中的真空。然而&#xff0c;代码覆盖率的价值一直是个争议的话题。每次聊到代码覆盖率时&#xff0c;似乎都会引发无尽的争论。由于大家固…

88、K-Planes: Explicit Radiance Fields in Space, Time, and Appearance

简介 主页&#xff1a;https://sarafridov.github.io/K-Planes/ 图像使用一个平面表示&#xff0c;静态三维场景用三个平面表示&#xff0c;后续动态场景用三个平面加一维时间 t 表示&#xff0c;论文提出使用六个平面表示动静态场景&#xff0c;即静态场景占三个平面&#x…