AtCoder Regular Contest 006 D - アルファベット探し

特に学び的なことはなかったけど,かなり面倒そうに見える問題が楽に解けたので.

問題は ↓ から.

atcoder.jp

解法

# マスから上下左右 + 斜め 4 方向の合計 8 方向に存在する # マスへ辺を張ったグラフを考えると,A, B, C はすべて連結であることに着目する.等倍の A, B, C に対応する連結成分の大きさはそれぞれ 12, 16, 11 で全て異なるので,これを使って判定することを考える.なお,制約より図形が重なることはないので 2 つ以上の文字が同じ連結成分に属することはない.

連結成分の大きさが  X のアルファベットを  k 倍拡大すると,拡大後の連結成分の大きさは  k ^ 2X となる.

従って,Union-Find や幅優先探索により各連結成分の大きさ  S を取得し,

 S=k ^ 2X\quad k\in\mathbb{N} ^ +,\; X\in\{12,16,11\}

を満たす  k,  X を決定する問題へと落とすことができた.

 S が持つ素因数  11 および  3 の数に着目することで, X および対応するアルファベットは次のように求められる.

  1.  S=1 のとき: 空マス.
  2.  S が素因数  11 を奇数個持つとき:  X=11 で,対応するアルファベットは C.
  3.  S が素因数  3 を奇数個持つとき:  X=12 で,対応するアルファベットは A.
  4. 上記以外:  X=16 で,対応するアルファベットは B.

以上より,幅優先探索を用いることにすれば全体  O(HW) でこの問題を解くことが出来る.