|
2014年12月14日
情報オリンピック日本委員会
|
部分点解法
すべてのマスを調べて崩れるかどうか判定する,という動作を繰り返す.崩れる城マスが一つも無くなったら終了.
計算量は O( (答え) × HW) となる.サンプル入力2を見ればわかるとおり,答えは HW 程度の大きさになりうる.そのため計算量は O(H^2W^2) となり,入力1では間に合うが,入力2以降は現実的な時間内に計算が終わらない.
満点解法
次の事実に注目しよう.二回目以降の波においては,崩れる城マスの候補は,前回の波で崩れたマスの周囲8マスにあるものに限られる.そのため,そのようなマスについてのみ崩れるかどうか判定すればよい.
このような方針で計算すると,任意の城マスについて,それが崩れるかどうかの判定は高々8回しか行われないことになる.そのため計算量は O(HW) となり,すべての入力に対して現実的な時間内に計算が終了する.
実装では,各波に対して,それによって崩れる城マスの位置をキューやスタックといったデータ構造に格納して記録すればよい.直前のひとつの波についてのみ記録しておけばよいので,次のようにすれば,用いるキューは実は二つで足りる.
また,各マスについて,周囲の更地マスの数を記録し,あるマスが崩壊するたびに更新していくようにすれば,崩れるかどうかの判定が楽になる.