AT_xmascon19_c Sokoban

题目描述

# Sokoban(推箱子) ## 题意翻译 小兔子的房间是一个有H行W列个格子的长方形。有三种格子,分别是“一般格子”、“目标位置格子”和“固定家具格子”。起初,小兔子和它的行李位于互不相同的“一般格子”上。 把从上往下数第i行,从左往右数第j列的格子记作$A_{i,j}$,一个格子可能出现以下几种状态: * ` .`:空的一般格子 * `R`:小兔子的位置 * `a`:一般格子,上面有小兔子的行李 * `O`:目标位置格子,上面没有行李 * `@`:目标位置格子,上面有行李 * `#`:固定家具格子 小兔子想要将所有的行李都放到目标位置上。在接下来的每次行动中,它都可以选择以下两种行动方式中的一种执行: * 走向它所在格子的上下左右个格子中的任意一个空的格子 * 走向它所在格子的上下左右个格子中的任意一个有行李的格子,同时行李向小兔子移动的方向移动一格 请求出小兔子最少的行动次数。 此外,该问题的所有输入文件都是公开的(请参照“评测”一段)

输入格式

共H+1行,第一行输入两个整数H,W 接下来的H行,每行输入W个字符,表示小兔子的房间

输出格式

输出最小的行动次数

说明/提示

* $5 \leq H \leq 400$ * $5 \leq W \leq 400$ * $A_{i,j}$($1 \leq i \leq H,1 \leq j \leq W$)是`.`,`R`,`a`,`O`,`@`和`#`中的一个。 * 输入数据中只有一个`R` * 输入数据中`a`和`O`的数量相等,且多于一个 * 输入数据保证房间的边缘都是`#` * 输入数据保证存在能将所有的行李都放到目标位置上的方法 ## 评测 * 共有五个测试点,分别为`01.txt`,`02.txt`,`03.txt`,`04.txt`,`05.txt`,各个测试点占分不同,分别为7分,11分,17分,25分和40分。 * 在[此处](https://img.atcoder.jp/xmascon19/sokoban.zip)下载输入数据 * 你也可以实际操作小兔子在输入数据对应的房间中收视行李,[链接在这里](https://img.atcoder.jp/xmascon19/sokoban.html)(对应的html文件已包含在下载的输入数据中) (顺便解释一下这个实操网站上的内容:这里面包含了样例,五个测试点的输入和一个附加房间(“omake”,不包含在输入数据中),用上下左右的方向键或者WASD又或是HJKL操作小兔子,网站中的“読み込み”是刷新的意思,“手数”是当前的步数,换地图后要点一下“読み込み”才会显示对应的房间)