D - Polyomino 解説 by hirayuu_At

マスを座標の集合で持つ別解

本質的には公式解説と変わりませんが、グリッド状のものはそのまま扱うよりも \((x,y)\) の組を集合として持つほうが、配列外参照や回転の方法などを注意深く考える必要がなくなり非常に簡潔になります。

明らかに3つのパーツのマス数の合計が16でないときNoであるので、そうでないものを考えます。以降、左上のマスの座標を \((0,0)\) とします。

平行移動は、集合のすべての \(x,y\) に一定の値を加算すればよいです。この問題の場合、集合の中での \(x,y\) の最小値が \(0\) から \(3\) となる範囲を考えればよいことがわかります。

90度回転は、\((x,y)\)\((y,-x)\) に置き換えるなどとすればよいです。二次元平面上で考えるとわかりやすいでしょう。

敷き詰められているかの判定は、3つの和集合に \((0,0),(0,1),\dots,(3,2),(3,3)\) すべての座標が含まれていることを判定すればよいです。

同じような手法はABC307 - CABC218 - Cなど、グリッドの重実装問題で使えます。

実装例(コンテスト中に書いたものなので非常に難読となってしまっています)

投稿日時:
最終更新: