Coding is the closest thing we have to superpower !

3141 : 搜索进阶-练习-噩梦
描述

王子做了一个噩梦,它梦见公主被困在一个n*m的格子迷宫中。更糟糕的是,这个迷宫里面还有2个会杀人的恶魔。现在王子想知道,他能否在恶魔吃掉他们之前救出公主。
所有角色在迷宫中可以向4个方向移动。每一秒钟,王子可以走3步,而公主可以走1步。恶魔每一秒钟会分化出分身占领与其曼哈顿距离不超过2的格子。

注意:新化出的分身每一秒也会自己分裂去占领格子。

每一秒钟的时候,恶魔先分裂自己占领格子,然后才是王子和公主开始行动。如果王子或者公主走到了被恶魔占领的格子,那么它们就会死掉。
当王子和公主在同一个格子的时候,王子就可以救出公主了。

输入

第一行输入一个整数T(1 \le T \le 50),表示测试数据的数目。
对于每一组数据,第一行输入两个整数 n, m (1 \le n, m < 800)
接下来n行,每行m个字符描述迷宫。
‘.’表示空地,可以行走。

‘X’ 表示墙,不能走。
‘M’ 表示王子。

‘G’ 表示公主。

‘Z’ 表示恶魔。

输入保证会有一个M一个G和两个Z。

输出

输出一个整数S,表示王子最少要经过几秒钟可以救出公主。

如果没有办法救出,输出-1。

样例

输入

3
5 6
XXXXXX
XZ..ZX
XXXXXX
M.G...
......
5 6
XXXXXX
XZZ..X
XXXXXX
M.....
..G...
10 10
..........
..X.......
..M.X...X.
X.........
.X..X.X.X.
.........X
..XX....X.
X....G...X
...ZX.X...
...Z..X..X

输出

1
1
-1
标签
语言:
主题: