C-最短补货路径(supply)

题目背景

在一座大型仓库中,机器人需要从起点出发,把货物送到终点。

但是这次任务有一个额外要求: 机器人在到达终点前, 必须至少经过一个补给点 ,以便补充电量。

仓库被看作一个二维网格图,其中有些位置可以通行,有些位置是障碍物。你的任务是求出机器人满足要求时的最短路径长度。

题目描述

给定一个 n×mn \times m 的字符网格,其中每个位置可能是以下五种字符之一:

  • S:起点,恰有一个;
  • T:终点,恰有一个;
  • P:补给点,可以有多个;
  • .:空地,可以通行;
  • #:障碍,不能通行。

机器人每次可以向上、下、左、右四个方向移动一格,前提是目标位置不是障碍物。

请你求出从 S 出发,到达 T,并且 路径中至少经过一个 P 的最短路径长度。

如果不存在满足条件的路径,输出 -1

输入格式

第一行输入两个整数 n,mn,m,表示网格的行数和列数。

接下来输入 nn 行字符串,每行长度为 mm,描述整个网格。

输出格式

输出一个整数,表示满足要求的最短路径长度。

如果不存在这样的路径,输出 -1

输入输出样例

输入 #1

4 5
S..#P
.#...
P..#.
..T..

输出 #1

5

样例解释

一种最优走法是:

  • S 先走到左下角的补给点 P
  • 再从这个补给点走到 T

对应路径长度为:

  • SP22 步;
  • PT33 步。

总长度为:

2+3=52+3=5

数据范围

对于所有测试数据,保证:$1 \le n,m \le 1000,\quad 1 \le n \times m \le 2 \times 10^5$

并保证:

  • 网格中恰有一个 S
  • 网格中恰有一个 T
  • 字符只会是 STP.# 之一。

本题共设 2020 个测试点,各测试点满足的限制如下:

测试点编号 分值 n,mn,m n×mn \times m 特殊性质
1\text{1} 55 5\le 5 25\le 25 无特殊性质
2\text{2} AA
3\text{3} 10\le 10 100\le 100 BB
4\text{4} 无特殊性质
5\text{5} 20\le 20 400\le 400
6\text{6} DD
7\text{7} 30\le 30 900\le 900 EE
8\text{8} FF
9\text{9} 50\le 50 2500\le 2500 无特殊性质
10\text{10} 100\le 100 104\le 10^4 BB
11\text{11} 无特殊性质
12\text{12} 150\le 150 2×104\le 2 \times 10^4
13\text{13} 200\le 200 4×104\le 4 \times 10^4 DD
14\text{14} 300\le 300 6×104\le 6 \times 10^4 无特殊性质
15\text{15} 400\le 400 8×104\le 8 \times 10^4 EE
16\text{16} 500\le 500 105\le 10^5 FF
17\text{17} 700\le 700 1.2×105\le 1.2 \times 10^5 无特殊性质
18\text{18} 800\le 800 1.5×105\le 1.5 \times 10^5 GG
19\text{19} 1000\le 1000 2×105\le 2 \times 10^5 AAGG
20\text{20} 无特殊性质

特殊性质 AA:保证网格中恰有一个补给点 P

特殊性质 BB:保证网格中没有障碍物 #

特殊性质 DD:保证所有补给点 P 都可以从 S 到达,且都可以到达 T

特殊性质 EE:保证网格恰有一行,即 n=1n=1

特殊性质 FF:保证网格恰有一列,即 m=1m=1

特殊性质 GG:保证补给点 P 的数量不超过 22

相关

在下列比赛中:

「果壳杯」 ROUND 44 (Div. 4)