孙悟空救师傅
题号:NC235903
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

师傅又被妖怪抓走了。师傅被困的宫殿可以看作一个  的由字符构成的矩阵,每一个字符表示一个房间。字符'K'表示孙悟空的起始位置,'T'表示师傅被困的位置,'S'表示有蛇的房间,'.'表示空房间,'#'表示无法进入的房间。矩阵中包含且仅包含一个'K'和一个'T'。

每分钟,孙悟空都可以上下左右移动一格,如果遇到蛇,打倒蛇需要额外花费一分钟,保证地图上最多有五个有蛇的房间。此外孙悟空还需要集齐所有种类的钥匙才能救出师傅。钥匙的种类以 1,2,...,m 的顺序编号,且钥匙需要按照顺序拿。具体来说,孙悟空能拿第 i 种钥匙,当且仅当对于  且 j 种类的钥匙都已经拿到至少一把。除了'#'的房间,其它所有房间都可以经过。孙悟空想要尽快救出师傅,你能帮帮他吗。

输入描述:

第一行输入两个整数  ,分别表示宫殿的大小和钥匙的总数。

接下来 n 行,每行 n 个字符,字符仅由'K','T','.','S','#'以及1到m的数字字符组成。数据保证'K','T' 出现且仅出现一次,1到m的数字字符至少出现一次,'S'字符最多出现5次。

输出描述:

输出一行,如果孙悟空能救出师傅,输出一个整数表示孙悟空至少需要多少分钟才能救出师傅。否则输出"impossible"

示例1

输入

复制
3 1
K#T
.S#
1#.

输出

复制
impossible
示例2

输入

复制
3 2
KTS
#S1
#22

输出

复制
8