問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!
では、実際に解いてみましょう。
まず、あり得る盤面としては 2 ^ 16 通りあります。
このとき、それぞれの盤面で先手が勝てるかどうかについて考えていきます。
まず、自明なものとして、ゲームがすでに終了していればその時点で決着がついています。そのとき、盤面に打たれた点の数が奇数なら先手の負け盤面、偶数なら先手の勝ち盤面となります。
これは問題 5 と同じようにゲームが終了しているかを判定することが出来ます。
ある盤面において、打てる手はまだ点が打たれていない格子点に点を打つことです。
ここで、問題 6 と同様に打てる手に対して結果が決まっていることを仮定します。
(1)盤面に打たれている点が奇数個のとき
次に打つのは後手になります。後手の勝ち = 先手の負けであるため、どの手を打っても先手の勝ち盤面になる場合は先手の勝ち盤面、そうでない場合は先手の負け盤面であることがわかります。
(2)盤面に打たれている点が偶数個のとき
次に打つのは先手になります。問題 6 同様先手が先手の勝ち盤面になる手がある場合には先手の勝ち盤面、そうでない場合は先手の負け盤面になります。
このように打つ手に対して結果がわかれば、先手の勝ち盤面であるか先手の負け盤面であるかはわかります。
ではどのように見ていけばよいのでしょうか?
これはすでに結果が確定しているところからさかのぼって先手の勝ち盤面か先手の負け盤面かを見ていけばよいことがわかります。このような手法を後退解析といいます。
問題
3×3 のグリッドが与えられます。AさんとBさんはグリッドの格子点 (16 個) を以下のように選んでいきます。
入力は以下のフォーマットで与えられます。
S_{1,1} S_{1,2} S_{1,3} S_{1,4}
S_{2,1} S_{2,2} S_{2,3} S_{2,4}
S_{3,1} S_{3,2} S_{3,3} S_{3,4}
S_{4,1} S_{4,2} S_{4,3} S_{4,4}
答えを 1 行で出力してください。
Aが勝つ場合 A
をBが勝つ場合は B
を出力してください。
すべてのテストケースにおいて、以下の条件をみたします。
1 1 0 0
1 0 0 1
1 0 0 0
0 1 0 1
B
1 0 0 1
0 1 0 1
0 0 1 1
0 0 0 1
A