#P11492. [2023省队模拟]推箱子
[2023省队模拟]推箱子
题目描述
是一个经典的游戏。有一个 的棋盘,格子要么是平地,要么是障碍。有一个箱子被放在一个平地上,另一个平地上站着玩家。玩家可以往上下左右四个方向走,如果是顶着箱子走,并且箱子后面是平地,那么箱子就会被推进一格。玩家的目标是把箱子推到箱子的目标位置,然后走到玩家的目标位置。
但是,本题中的推箱子游戏和一般的推箱子游戏规则不同,请仔细阅读一下规则:
本题中只有一个箱子,并且这个箱子是个“虫洞”,这意味着,如果玩家移动出了棋盘的范围,它可能会被传送到箱子边界上的一格中;如果玩家移动向箱子且这个方向上箱子无法被推动,那么玩家可能被传送到一个网格边界上的空地上。
并且玩家不止需要完成“箱子到位、玩家到位”这两个目标,还需要最小化推动箱子的次数,来节约体力。
以下是这个游戏的完整规则,请务必完整准确阅读:
给定一个 的棋盘,向量 表示第 行第 列。行号为 ,列号为 。
规定 分别表示玩家的四种操作(上下左右),形式化地:
$$\vec{v_W}=(-1,0),\vec{v_S}=(1,0),\vec{v_A}=(0,-1),\vec{v_D}=(0,1) $$为了以下描述的方便,再给定四个格子:
$$\vec{w_W}=\left(n,\left\lceil\frac m2\right\rceil\right), \vec{w_S}=\left(1,\left\lceil\frac m2\right\rceil\right), \vec{w_A}=\left(\left\lceil\frac n2\right\rceil,m\right), \vec{w_D}=\left(\left\lceil\frac n2\right\rceil,1\right) $$每一步,玩家可以选择一个方向 ,玩家当前位置矢量为 ,方向为 , 是操作前包含箱子的位置矢量,那么:
- 若 ,并且 是平地,那么玩家移动到 ,箱子移动到 。注意,** 只有这种情况会花费体力 ** ,你只需要最小化这种情况出现的次数。
- 若 是障碍,那么什么都不发生。
- 若 是平地且 ,那么玩家移动到 。
- 若 且 在棋盘外,那么什么都不发生。
- 若 且 是障碍, 为障碍,那么什么都不发生。
- 若 且 是障碍, 为平地,那么玩家移动到 。
- 若 在棋盘外且 是障碍,那么什么都不发生。
- 若 在棋盘外且 在棋盘外,那么什么都不发生。
- 若 在棋盘外且 是空地,那么玩家移动到 。
请注意上面枚举了每一种情况,但是实际上会有作用的操作只有 种。而你需要最小化的,只有第一种情况的次数。
输入格式
本题多组测试。输入的第一行包含一个整数 ,表示数据组数。对于每组数据:
第一行包括两个整数 表示棋盘的大小。
接下来 行,每行一个长度为 的字符串,表示棋盘的状态。
- 表示此格为障碍。
- 表示此格是平地。
- 表示此格是玩家。
- 表示此格是箱子。
- = 表示此格是玩家的目的地。
- - 表示此格是箱子的目的地。
保证 各出现恰好一次。
输出格式
对于每组数据:
如果不可能达成目标,输出一行一个 ;否则,输出一行一个整数,表示推箱子的最小次数。
数据范围
对于 的数据,满足没有障碍格。
另有 的数据, , , 。
另有 的数据, 。
对于 的数据,满足 , 。
输入样例 1
3
9 9
#########
#####..-#
#..=##.##
#.p.##.##
....##.##
#...b..##
#...##.##
#....####
####.####
9 9
#########
#.......#
#.#####.#
#.#=....#
..#....-#
###.p.#.#
#.....#b#
#.....#.#
####.####
9 9
####.####
#....####
#.####.##
#.......#
#.......#
###.#####
#=.b#..##
#-..p..##
#########
输出样例 1
7
4
19
输入样例 2
1
2 2
pb
-=
输出样例 2
-1