钥匙迷宫(key)

题目描述

DAMON THRONE\text{DAMON THRONE} 的训练系统生成了一个 nnmm 列的机关迷宫。

迷宫中的每个格子可能是:

  • .\texttt{.}:空地,可以经过;
  • #\texttt{\#}:墙壁,不能经过;
  • S\texttt{S}:起点;
  • T\texttt{T}:终点;
  • aj\texttt{a}\sim\texttt{j}:钥匙;
  • AJ\texttt{A}\sim\texttt{J}:门。

小 D 从起点 S\texttt{S} 出发,每一步可以向上、下、左、右相邻格子移动一格。

如果小 D 走到某个钥匙格子,例如 c\texttt{c},就会获得钥匙 c\texttt{c}

如果小 D 想进入某个门格子,例如 C\texttt{C},则必须已经拥有钥匙 c\texttt{c}

钥匙获得后不会丢失,可以重复使用。

请你求出小 D 从 S\texttt{S}T\texttt{T} 的最少步数。

如果无法到达终点,输出 1-1

输入格式

第一行包含三个整数 n,m,Kn,m,K,表示迷宫行数、列数和钥匙种类数。

接下来 nn 行,每行包含一个长度为 mm 的字符串,表示迷宫。

保证迷宫中恰好有一个 S\texttt{S} 和一个 T\texttt{T}

迷宫中只会出现前 KK 种钥匙和门,即:

aa+K1\texttt{a}\sim \texttt{a}+K-1

以及:

AA+K1\texttt{A}\sim \texttt{A}+K-1

输出格式

输出一行一个整数。

如果可以到达终点,输出最少步数;否则输出 1-1

输入输出样例 #1

输入 #1

4 5 2
S.a#.
##A#.
.b.BT
.....

输出 #1

8

样例解释 #1

一种最优路线为:

先从 S\texttt{S} 出发拿到钥匙 a\texttt{a},打开门 A\texttt{A} 后继续前进,再绕到下方拿到钥匙 b\texttt{b},最后打开门 B\texttt{B} 到达 T\texttt{T}

最少需要 88 步。

输入输出样例 #2

输入 #2

3 4 1
S#A.
####
..T.

输出 #2

-1

数据范围与约定

对于所有测试数据,保证:

1n,m1000,0K101 \le n,m \le 1000,\quad 0 \le K \le 10

并保证:

n×m×2K3×106n\times m\times 2^K \le 3\times 10^6
测试点 分值 n,mn,m KK 特殊性质
121\sim 2 1010 20\le 20 2\le 2
343\sim 4 2020 100\le 100 00 A\text{A}
565\sim 6 200\le 200 5\le 5 B\text{B}
787\sim 8 500\le 500 10\le 10 C\text{C}
9109\sim 10 3030 1000\le 1000

特殊性质 A\text{A}:保证迷宫中没有钥匙和门。

特殊性质 B\text{B}:保证迷宫中没有墙壁 #\texttt{\#}

特殊性质 C\text{C}:保证每种钥匙最多出现一次。