在一个分层防御系统中,有一个 $n \times m$ 的网格。行从上到下依次编号为 $1$ 到 $n$,列从左到右依次编号为 $1$ 到 $m$。某些格子最初包含障碍物。
一架入侵的无人机从第 $n$ 行的一个空格子出发,并试图向上突破。你需要在它到达第 $1$ 行之前放置额外的障碍物来拦截它。
假设无人机当前位于格子 $(r, c)$。如果 $r > 1$,它将在本轮中向上移动一行,其目标只能是以下三个位置之一:$(r - 1, c - 1)$,$(r - 1, c)$,$(r - 1, c + 1)$。它移动到的格子必须满足:
- 在网格边界内;
- 该格子中没有障碍物。
如果无人机到达第 $1$ 行,则被视为成功突破,你的程序失败。
在无人机每次移动后,如果它当前位于 $(r, c)$ 且 $r > 1$,你最多可以放置一个新障碍物。如果你选择放置一个障碍物,该障碍物必须放置在当前为空的格子 $(x, y)$ 中,且满足 $x \in \{r - 1, r - 2\}$,$1 \le x \le n$,$1 \le y \le m$。也就是说,你只能在无人机当前位置上方第一行或第二行添加障碍物。新放置的障碍物将永久保留;你也可以选择在本轮中不放置任何障碍物。
你的目标是使无人机在某个时刻无法进行任何移动,从而成功拦截它。
保证对于每个测试用例,都至少存在一种策略可以确保你在无人机到达第 $1$ 行之前将其拦截。
输入格式
第一行包含两个整数 $n$ 和 $m$($2 \le n, m \le 100$),表示网格的行数和列数。
接下来的 $n$ 行,每行包含一个长度为 $m$ 的字符串 $s_i$,描述初始网格状态:
- 如果 $s_{i,j} = \#$,则格子 $(i, j)$ 最初包含一个障碍物;
- 如果 $s_{i,j} = \text{.}$,则格子 $(i, j)$ 最初为空。
保证第 $n$ 行至少包含一个空格子。
最后一行包含两个整数 $r_0$ 和 $c_0$,表示无人机的初始位置 $(r_0, c_0)$。保证 $r_0 = n$ 且该格子最初为空。
在读取输入后,你将按照以下规则进行交互。
交互
在读取输入后,你将重复执行以下交互,直到过程结束:
输出两个整数 $x$ $y$。
- 如果 $(x, y) = (0, 0)$,表示你选择在本轮中不放置障碍物;
否则,表示你在格子 $(x, y)$ 处放置一个新障碍物。在这种情况下,必须满足以下条件:
- 该格子在网格边界内;
- 该格子当前不包含障碍物;
- 如果无人机当前在第 $t$ 行,则必须满足 $x \in \{t - 1, t - 2\}$。
然后交互器将无人机移动一步,并输出两个整数 $r$ 和 $c$:
- 如果 $(r, c) = (0, 0)$,表示无人机无法再进行移动,这意味着你已成功拦截它。你的程序应立即终止;
- 如果 $(r, c) = (-1, -1)$,表示你未能拦截它。这发生在无人机已经到达第 $1$ 行或你的输出无效时。你的程序应立即终止,你将获得“Wrong answer”(答案错误);
- 否则,无人机已移动到格子 $(r, c)$,下一轮开始。
如果你的程序在读取 $(0, 0)$ 或 $(-1, -1)$ 后继续进行交互,或者未能遵守交互协议,你也将获得“Wrong answer”。
在输出后,请刷新输出缓冲区;否则你可能会遇到“Idleness limit exceeded”(闲置超限)。例如:
- C/C++:
fflush(stdout)或cout.flush() - Java:
System.out.flush() - Python:
sys.stdout.flush()
样例
输入样例 1
5 5 ..... ..... #.#.. ..#.. ..... 5 3 4 2 0 0
输出样例 1
4 4 3 2
说明
交互器可以是自适应的(adaptive)。也就是说,在交互开始之前,无人机的移动路径不一定是固定的。
初始障碍物和你在之后放置的障碍物将永久保留,永远不会消失。
无人机永远不会进入包含障碍物的格子。
你必须确保无论交互器如何移动,你的策略最终都能拦截无人机。
上述样例交互过程如下:
- 最初,无人机位于 $(5, 3)$。
- 在第 1 轮中,你输出
4 4,在 $(4, 4)$ 处放置一个障碍物。现在第 4 行在 $(4, 3)$ 和 $(4, 4)$ 处有障碍物,因此无人机只能移动到 $(4, 2)$。交互器随后输出4 2。 - 在第 2 轮中,你输出
3 2,在 $(3, 2)$ 处放置一个障碍物。现在第 3 行中的格子 $(3, 1)$、$(3, 2)$、$(3, 3)$ 均无法到达。交互器随后输出0 0,表示你已成功拦截无人机。