S41001.10-1 翻滚积木

传统题 时间 1000 ms 内存 256 MiB 3 尝试 0 已通过 0

10-1 翻滚积木

翻滚积木

核心缓存区的第一层,是一片由光构成的迷宫。地面是整齐的方格,墙壁由半透明的数据流砌成。迷宫中央横卧着一个巨大的长方体积木——不是玩具,是Zero最早的感知训练器。

"它曾经用这个学习空间。"Echo说,投影绕着积木转了一圈,"把它翻进角落的坑里,门就会打开。"

"咋个翻?"CC问。

"积木可以朝四个方向翻滚。"你蹲下来,用手指在地面比划,"站着的时候占一格,倒了就占两格。如果翻滚时撞到墙或者悬空,就翻不过去。"

CC试着推了推积木——纹丝不动。

"不是推,是让它自己滚。"你说,"选一个方向,让它倒下去。倒下的过程中不能有任何一格是墙或者悬空。"

"这就像……"CC想了想,"像推一个醉汉走路。每步都要算好会不会摔。"

"对。"

你开始写。把积木的状态记下来——站在哪一格、朝哪个方向倒着。每一步尝试四个方向翻滚,检查翻滚过程中经过的格子是否都合法。找到翻滚到目标坑里的最少步数。

屏幕上的数字一跳一跳。十七步。

"十七步。"你说,"最短路径。"

"你咋个晓得是最短?"CC问。

"因为每一步代价一样。"你说,"先到达的步数一定最少。"

积木在屏幕上滚了十七次,最后"咚"的一声掉进坑里。地面裂开一道缝隙,露出通往第二层的阶梯。

"走。"Echo说。


题目描述

n×mn \times m 的网格迷宫。一个 1×1×21 \times 1 \times 2 的长方体积木初始直立在某格。积木可以向东、南、西、北四个方向翻滚。直立时占 1×11 \times 1 格子,倒下时占 1×21 \times 22×12 \times 1 格子。翻滚过程中经过的所有格子必须都是空地,且不能超出边界。目标是把积木翻进指定的"洞"格子(洞只能由直立状态进入)。求最少翻滚次数。

输入格式

多组数据。每组数据先输入 n,mn, m。然后 nn 行字符串,描述网格:. 空地,# 墙,X 洞,B 积木初始位置(也是空地)。

输出格式

每组数据输出最少翻滚次数。无法到达输出 impossible

输入样例

3 3
...
.#.
...

输出样例

Impossible

提示

  • BFS 状态为 (x,y,state)(x, y, state)statestate 表示积木姿态(直立 / 东西倒 / 南北倒)。
  • 每次转移需检查翻滚路径上所有格子是否合法。
  • 目标状态为积木直立且位于 X

第二层是一片废弃的仓库。生锈的货架之间散落着无数货箱,有些挡在路中央。远处有一扇发光的门——但门前面有一个凹槽,大小刚好能嵌进一个货箱。

"要把货箱推到那个位置。"Echo说,"Zero用这个游戏训练工人的服从性。"

"矿区也干过这种活。"CC说,语气里带着一丝烦躁,"推石头,搬箱子,听命令。"

"但这次。"你说,"推箱子的是你,听命令的是你自己。"

CC没说话,但已经走到一个货箱前,双手按了上去。

在线编程 IDE

建议全屏模式获得最佳体验