在滑块拼图中,我们通过不断将滑块(方块)移动到框架内的空位中,以达到目标放置状态。
一位谜题设计者结合了滑块拼图和迷宫的想法,设计了一种新的谜题。该谜题在一个被分割为单位正方形的矩形框架中进行。一些方格预先被障碍物占据。框架中放置了若干个滑块:一个 $2 \times 2$ 的“王”(king)滑块和若干个 $1 \times 1$ 的“兵”(pawn)滑块。恰好留有两个 $1 \times 1$ 的空位。如果一个“兵”滑块与一个空位相邻,我们可以将该滑块滑动到该空位。如果“王”滑块的一整条边与两个空位相邻,我们可以滑动“王”滑块。我们不能移动障碍物。从给定的初始放置状态开始,谜题的目标是将“王”滑块移动到框架的左上角。
下图展示了样例输入中第四个数据集的初始放置状态。
图 E.1:样例输入中的第四个数据集。
你的任务是编写一个程序,计算从给定的滑块放置状态解决该谜题所需的最少移动步数。这里,一步移动是指将“王”或“兵”滑块滑动到相邻的位置。
输入格式
输入包含多个数据集。每个数据集的第一行包含两个由空格隔开的整数 $H$ 和 $W$,其中 $H$ 和 $W$ 分别是框架的高度和宽度。
接下来的 $H$ 行,每行包含 $W$ 个字符,表示滑块的初始放置状态。在这 $H$ 行中,X、o、* 和 . 分别表示“王”滑块的一部分、“兵”滑块、障碍物和空位。这 $H$ 行中不包含其他字符。
你可以假设 $3 \le H \le 50$ 且 $3 \le W \le 50$。
包含两个由空格隔开的零的一行表示输入结束。
输出格式
对于每个数据集,输出一行,包含将“王”滑块移动到左上角所需的最少移动步数。如果无法做到,则输出 -1。
样例
输入样例 1
3 3 oo. oXX .XX 3 3 XXo XX. o.o 3 5 .o*XX oooXX oooo. 7 12 oooooooooooo ooooo*****oo oooooo****oo o**ooo***ooo o***ooooo..o o**ooooooXXo ooooo****XXo 5 30 oooooooooooooooooooooooooooooo oooooooooooooooooooooooooooooo o***************************oo XX.ooooooooooooooooooooooooooo XX.ooooooooooooooooooooooooooo 0 0
输出样例 1
11 0 -1 382 6807