#DJKS343. 拯救公主
拯救公主
题目描述
多灾多难的公主又被大魔王抓走啦!国王派遣了第一勇士阿福去拯救她。
身为超级厉害的术士,同时也是阿福的好伙伴,你决定祝他一臂之力。你为阿福提供了一张大魔王根据地的地图,上面标记了阿福和公主所在的位置,以及一些不能够踏入的禁区。你还贴心地为阿福制造了一些传送门,通过一个传送门可以瞬间转移到任意一个传送门,当然阿福也可以选择不通过传送门瞬移。传送门的位置也被标记在了地图上。此外,你还查探到公主所在的地方被设下了结界,需要集齐K种宝石才能打开。当然,你在地图上也标记出了不同宝石所在的位置。
你希望阿福能够带着公主早日凯旋。于是在阿福出发之前,你还需要为阿福计算出他最快救出公主的时间。
地图用一个的字符矩阵来表示。字符表示阿福所在的位置,字符表示公主所在的位置,字符 # 表示不能踏入的禁区,字符 $ 表示传送门,字符 . 表示该位置安全,数字字符 0 至 4 表示了宝石的类型。阿福每次可以从当前的位置走到他上下左右四个方向上的任意一个位置,但不能走出地图边界。阿福每走一步需要花费 1 个单位时间,从一个传送门到达另一个传送门不需要花费时间。当阿福走到宝石所在的位置时,就视为得到了该宝石,不需要花费额外时间。
输入
第一行是一个正整数,表示一共有组数据。 每一组数据的第一行包含了三个用空格分开的正整数和,表示地图是一个的矩阵,而阿福需要集齐种宝石才能够打开拘禁公主的结界。 接下来的行描述了地图的具体内容,每一行包含了个字符。字符含义如题目描述中所述。保证有且仅有一个和。 $ 的数量不超过10 个。宝石的类型在数字 0 至 4 范围内,即不会超过 5 种宝石。
输出
对于每一组数据,输出阿福救出公主所花费的最少单位时间。若阿福无法救出公主,则输出“oop!”(只输出引号里面的内容,不输出引号)。每组数据的输出结果占一行。
样例
1
7 8 2
........
..S..#0.
.##..1..
.0#.....
...1#...
...##E..
...1....
11