ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

第5回 ドワンゴからの挑戦状 本選 A - Taro vs. Jiro

問題
提出コード

解法

まずは、Kが奇数の場合について考えます。
太郎目線で考えると、"初手で行ける範囲内に青いマスが存在していれば必ず勝利できる"となります。
何故かというと、青いマスが最初のマスに隣接していた場合、初回の行動で太郎君はその青いマスに移動すれば、その後に次郎君がいかなる行動をしても、その次の太郎君のターンで、必ず今の青いマスに戻ってくることができるからです。
逆に、そのようなマスが無く、隣接するマスすべてが赤いマスだった場合、太郎君はどのようなマスに進んでも、次の次郎君のターンで初期のマスに戻されてしまい、Kターン目に青いマスへ行くことはできません。
ということで、Kが奇数の場合、
"初期位置に青いマスが隣接していた場合は太郎君(先手)の勝ち、1つも存在しなければ次郎君(後手)の勝ち"
となります。
では、Kが偶数の場合について考えます。
1ターン経過した後は、上記と同じ状況になります。
1ターン後は次郎君のターンなので、先手の太郎君は
"移動した結果、そのマスから移動できるマスが全て青"となるマスへ誘導すればよいです。
結局は、
"初期位置に隣接しているマスの中で、そのマスから移動できるマスが全て青いマスになっているものが存在していれば太郎君(先手)の勝ち、1つも存在しなければ次郎君(後手)の勝ち"
となります。
あとはこれを判定できればよく、あるマスについて、隣接しているマスに青(赤)色が存在しているかどうかは、入力の段階でメモしておくことでO(1)で調べられ、1マス移動した後に条件を満たすマスが存在しているかどうかは、全部で2M回しか調べることがないので、十分間に合います。

感想

久々(初めて?)ゲーム系の問題を解くことができました。
今回は、終わりの状態が多すぎて、グランディ数みたいな考え方ができないと思ったので、最善手をひたすら調べる方向で考察しました。
うまく解法がハマって解けたのでよかったです!