この問題では主に二次元配列、シミュレーションを問います。以下、1-indexed で考えます。
制約から 2≤H,W≤3000 なので、これは H×W の大きさの二次元配列を用いて、snowrate君が歩いたかどうかを 0,1 の 2 要素で判定できます。
"~している間だけ移動する" なので、while文を用いて実装することが最適だと思います。以下の解答例では、看板に書かれている方向が文字で与えられますが、このままだと方向を管理しづらいので数値で管理することにしています。
厳密には wi′=1,2,3,4 を方向 U, D, L, R を表すことにしています。
そしてsnowrate君が歩く座標 (nh,nw) と、歩く方向 nd を表す変数を用意します。いずれも整数型です。
snowrate君が今歩いている座標が盤面内を歩いている間、以下の動作を順番に行います。
- snowrate君が座標 (nh,nw) を歩いた印を付ける
- i=1,2,...N に対して (hi,wi)=(nh,nw) となる i が存在するなら wi′ の方向に変える、すなわち nd を wi′ に更新する
- snowrate君の向いている座標に 1 マスだけ進める
ここで解答例では、1 マスだけ進める座標の変位はベクトル配列 vh=(−1,1,0,0),vw=(0,0,−1,1) で管理しています。これは添え字を wi′ においてそろえています。
以上を用いて実装できます。最悪計算量は O(HWN) なので、十分間に合います。