SP2882 WARE - The Warehouse
题目描述
特工 OmeGa-7 发现了疯狂科学家 Dr. Matroid 的秘密武器仓库。仓库内摆满了大箱子,可能装着致命武器。在检查时,OmeGa-7 不小心触发了警报系统。仓库的防御系统非常有效:一旦警报响起,地板就会被致命的酸液覆盖。因此,OmeGa-7 现在唯一的逃生途径就是攀上箱子,想办法通过顶部的出口逃离。这个出口是天花板上的一个洞,只要他能穿过这个洞,就能乘坐停在屋顶的直升机逃脱。洞的下方有个箱子和梯子,所以他的目标是到达这个箱子。
仓库的地面是一个 $n \times n$ 的网格,每个格子大小为 $1 \text{米} \times 1 \text{米}$。每个格子要么由一个箱子完全占据,要么是空的。箱子是矩形,底面积为 $1 \text{米} \times 1 \text{米}$,高度可以是 2 米、3 米或 4 米。在图 (a) 中,你可以看到一个示例仓库,其中数字表示箱子的高度,E 是出口,圆圈标示着 OmeGa-7 当前的位置。
OmeGa-7 有两种行动方式:
1. 如果他站在一个箱子上,并且相邻的格子有另一个箱子,他就可以移至该箱子的顶部。例如,在图 (a) 的场景中,他可以向北或向东移动,但不能向西或向南。注意,这四个方向是唯一允许的,不能斜着走。而两个箱子之间的高度差不影响他的移动。
2. 另外,OmeGa-7 可以将所站的箱子向四个方向之一推倒。推倒效果可以通过例子说明:在图 (b) 所示的场景中,他可以把箱子向西推倒(图 (c))或向北推倒(图 (d))。高度为 $h$ 的箱子如果向北(或西、南等)推倒,它将占据其原始位置向北(或西、南等)的 $h$ 个连续格子,原位置将变为空,但可能因为其他箱子的推倒再次被占据。只有要推倒的方向是空的,箱子才可以推倒。例如,在图 (a) 中,OmeGa-7 站的箱子无法推倒。
推倒一个箱子时,OmeGa-7 会顺着推倒方向移动(见图 (c) 和图 (d))。被推倒的箱子不能再次推倒。记得出口所在的格子(标为 E)下有箱子,因此无法推倒任何箱子到这个格子上。警报系统很快就会释放出变异的毒蝙蝠,OmeGa-7 必须以最快速度逃离仓库。你需要帮助他编写程序,计算出到达出口的最少步数。无论是移动到相邻的箱子,还是推倒箱子,这都算作一步。
输入格式
输入由多个测试用例构成。每个测试用例的第一行包含三个整数:仓库大小 $1 \leq n \leq 8$,以及 OmeGa-7 的起始位置 $i, j$。这里 $i$ 是行号,$j$ 是列号,取值范围在 1 到 $n$ 之间。接下来的 $n$ 行描述了仓库的状况。每行是一个长度为 $n$ 的字符串,对应仓库中的一个格子。如果字符是 '.',则表示该格子为空。字符 '2'、'3' 和 '4' 表示相应高度的箱子。字符 'E' 表示出口的位置。
输入结束于 $n = i = j = 0$。
输出格式
对于每个测试用例,输出一行整数,表示到达出口的最少步数。如果无法到达出口,输出 `Impossible.`。
**本翻译由 AI 自动生成**