$H * W$ のグリッドで表される地図が与えられる。 各マスは '#' か '.' であり、前者は陸地であることを、後者は海であることを示している。
以下のように上下左右に隣接している陸地の集合を島と呼ぶ。
..... .###. ..##. ..#.. .....
陸地 $6$ マスの島。
...... .##.#. ....#. ......
陸地 $2$ マスの島が $2$ つ。
与えられる地図は、以下の条件を満たす。
..... .###. .#.#. .###. .....
陸地のどこかにAORイカちゃんがいる。 あなたの目標は、AORイカちゃんが最初にいたマスを当てることである。 そのために、あなたは次のクエリを繰り返し送ることができる。
クエリを高々 $800000$ 回 まで送ることで、AORイカちゃんが最初にいたマスを求めよ。
まず、地図の大きさを表す非負整数 $H, W$ と、地図を表す $H$ 行 $W$ 列の文字 $c_{i,j}$ が与えられる。
$H\ W$
$c_{0,0}, \dots , c_{0, W - 1}$
$\vdots$
$c_{H - 1, 0}, \dots , c_{H - 1, W - 1}$
続いて、あなたのプログラムは何回か応答プログラムに質問をする.質問のフォーマットは以下のとおりである。
? com
$com$ は U, D, L, R のうちいずれか $1$ 文字である。 この質問で、指定された方向へ移動可能かを表す文字列が標準入力に $1$ 行で渡される。
何回か質問を行った後、あなたはAORイカちゃんの初期位置を当てる。AORイカちゃんが最初にいたマスを $c_{y,x}$ だとすると、
! y x
というフォーマットで出力する。初期位置を出力した後、あなたのプログラムは直ちに終了しなければならない。終了しなかった場合のジャッジ結果は不定である。 また、これら以外のフォーマットで出力した場合のジャッジ結果も不定である。
なお、質問や初期位置を応答プログラムに送ったあとフラッシュしないとTLEとなることがある。
フラッシュはCでは
fflush(stdout);
C++では
std::cout << endl;
で行うことができる。 fflush() は stdlib.h をインクルードすると使用できる。
プログラムへの入力 | プログラムの出力 |
---|---|
4 8 ........ .#.#.##. ...#.##. ........ |
|
? R | |
NO | |
? U | |
NO | |
? D | |
YES | |
? L | |
NO | |
! 1 3 |