P13128 [GCJ 2019 Finals] Go To Considered Helpful

题目描述

Marlin 是一条丢失了儿子的鱼,正在努力寻找他的儿子。幸运的是,他遇到了正在和兄弟 Wally 与 Seymour 一起游泳的海龟 Cynthia。Cynthia 知道 Marlin 需要去哪里,并且她可以非常精确地给出指引。虽然 Marlin 很聪明,能够完美地按照指令行动,但要记住一长串指令还是很困难的。Cynthia 需要想办法让指令列表尽可能简短。 Marlin 生活在一个有 $\mathbf{R}$ 行 $\mathbf{C}$ 列的矩阵中。矩阵中的某些格子是危险的,不能进入。Marlin 和他的儿子目前分别位于两个不同的非危险格子中。Marlin 的儿子不会移动。Cynthia 决定以程序的形式给 Marlin 指路,这个程序由若干条指令组成,每条指令占一行。每条指令有以下 5 种类型之一: - $\mathbf{N}$:向北(上)移动一格, - $\mathbf{S}$:向南(下)移动一格, - $\mathbf{W}$:向西(左)移动一格, - $\mathbf{E}$:向东(右)移动一格, - $\mathbf{G}(\mathbf{i})$:跳转到指令列表的第 $i$ 行(从 1 开始计数)。 每当执行前 4 种指令中的任意一种后,如果还有下一行指令,Marlin 会跳到下一行继续执行。如果没有下一行指令,Marlin 就会原地停留,永远不再移动。 例如,假如 Marlin 执行如下程序: 1. $\mathbf{N}$ 2. $\mathbf{E}$ 3. $\mathbf{G}(6)$ 4. $\mathbf{S}$ 5. $\mathbf{G}(1)$ 6. $\mathbf{W}$ 7. $\mathbf{G}(4)$ 他会先向北移动(第 1 行),然后向东移动(第 2 行),接着跳转到第 6 行(第 3 行),然后向西移动(第 6 行),再跳转到第 4 行(第 7 行),然后向南移动(第 4 行),再跳转到第 1 行(第 5 行),然后向北移动(第 1 行),如此循环往复。 如果某一时刻 Marlin 和他的儿子处于同一个格子,他们就会团聚,Marlin 也会停止执行任何指令。海龟 Cynthia 想知道,能够让 Marlin 安全到达他儿子所在格子的最短程序需要多少行指令,且在此过程中 Marlin 不能进入危险格子,也不能走出矩阵边界。所有 $\mathbf{G}$ 指令必须跳转到程序中已存在的行。

输入格式

输入的第一行为测试用例数 $\mathbf{T}$。接下来有 $\mathbf{T}$ 组测试数据。每组测试数据的第一行为两个整数 $\mathbf{R}$ 和 $\mathbf{C}$,表示矩阵的行数和列数。接下来有 $\mathbf{R}$ 行,每行包含一个长度为 $\mathbf{C}$ 的字符串。第 $i$ 行第 $j$ 列的字符 $\mathbf{A}_{ij}$ 表示矩阵中第 $i$ 行第 $j$ 列的格子。若该格子为危险格子,则为字符 $\#$;若为 Marlin 当前所在格子,则为大写字母 $\mathbf{M}$;若为 Marlin 儿子当前所在格子,则为大写字母 $\mathbf{N}$;若为未被占用的非危险格子,则为 $\mathbf{.}$。

输出格式

对于每组测试数据,输出一行,格式为 `Case #x: y`,其中 $x$ 为测试用例编号(从 1 开始),$y$ 为在上述条件下能让 Marlin 到达他儿子所在格子的最短程序所需的指令行数。如果不存在这样的程序,则输出 $\text{IMPOSSIBLE}$。

说明/提示

**样例说明** 下面是每个样例的最短程序示例。 - 样例 1: ``` 1: W 2: N 3: S 4: G(1) ``` 或 ``` 1: W 2: N 3: W 4: G(3) ``` - 样例 2: ``` 1: N 2: W 3: W 4: S 5: W 6: W 7: N ``` - 样例 3: ``` 1: W 2: W 3: N 4: N 5: G(2) ``` - 样例 4: ``` 1: W 2: W 3: N 4: N 5: E 6: G(1) ``` **样例解释** - $1 \leq \mathbf{T} \leq 100$。 - 对所有 $i$ 和 $j$,$\mathbf{A}_{ij}$ 只可能为 $\#$、$\mathbf{.}$、大写字母 $\mathbf{M}$ 或大写字母 $\mathbf{N}$。 - 恰好有一对 $i$ 和 $j$ 使得 $\mathbf{A}_{ij} = \mathbf{M}$。 - 恰好有一对 $i$ 和 $j$ 使得 $\mathbf{A}_{ij} = \mathbf{N}$。 **测试点 1(19 分,公开)** - 时间限制:30 秒。 - $1 \leq \mathbf{R} \leq 10$。 - $1 \leq \mathbf{C} \leq 10$。 **测试点 2(30 分,隐藏)** - 时间限制:120 秒。 - 最多 10 个测试用例满足: - $1 \leq \mathbf{R} \leq 100$。 - $1 \leq \mathbf{C} \leq 100$。 - 其余测试用例满足: - $1 \leq \mathbf{R} \leq 50$。 - $1 \leq \mathbf{C} \leq 50$。 由 ChatGPT 4.1 翻译