C - Hamiltonian Pieces 解説 by maspy


右・右上・上・左上・左・左下・下・右下方向の 1 回分の移動を表すベクトルを \(\overrightarrow{d_0}, \ldots, \overrightarrow{d_7}\) とします.

それぞれの方向への移動回数を \(a_i\) とすれば, \(\sum a_i\overrightarrow{d_i}=\overrightarrow{0}\)\(a_0+a_2+a_4+a_6=R\)\(a_1+a_3+a_5+a_7=B\) が成り立ちます.逆にこのような非負整数列 \(a\) があれば,例外を除きそのような移動回数を満たす駒の配置があります.\(\overrightarrow{d_i}\) 方向の移動 \(a_i\) 回が \(i=0,1,\ldots,7\) の順に行われるようにすれば,凸多角形の軌跡を描き,自己交差が自動的に回避できます.ただし凸多角形が退化してすべての点が同一直線上に並ぶ場合が例外となります.

\(R>0\), \(B>0\) ならばこのような例外は起こりません.\(\sum a_i\overrightarrow{d_i}=\overrightarrow{0}\) を満たす組について \(a_i\)\(a_{i+4}\)\(1\) を加える操作をすれば \(R\)\(B\)\(2\) ずつ増やすことが簡単にできて,

  • \(R\), \(B\) が正の偶数ならば \(a=(0,0,0,0,0,0,0,0)\) に対して \(a_0,a_4\)\(R/2\) を加え \(a_1,a_5\)\(B/2\) を加えたもの.
  • \(R\) が正の偶数で \(B\) が正の奇数ならば \(a=(1,0,1,0,0,1,0,0)\) に対して \(a_0,a_4\)\((R-2)/2\) を加え \(a_1,a_5\)\((B-1)/2\) を加えたもの.

\(a\) とすれば解が得られます.

あとは \(R=0\)\(B=0\) の場合の例外処理が必要ですがこの解説では省略します.

投稿日時:
最終更新: