#はじめに
『Rubyで数独:AIプログラミング入門』の「数の予約」の説明で使っている表の記法と解説をまとめる目的でこのノートは書いています。本の中で使っているパズルは数独通信からひっぱってきているので、そのままではあれなので無料で入手可能なOpen Sudokuのパズルに変更しています。
Open SudokuのVERY HARDのステージ53をある程度まで進めた図が次の左の図になります。この状況から先に進むのに「数の予約」を使えます。下の図の大きな数字は確定済みで、小さな数字はとりうる値を意味しております。
ここから、「数の予約」が使えるところまで、もう少し勧めます。まず中央上段の3X3のボックスに注目するとD5ですでに5が使われているのでD1, D2には5が入りません。
つまり、中央上段のボックスに注目すると5はE1かF1に入ります。従って、1列目の他のマスには5は入りません(いずれにしても理論)。ここでは今後の展開に関係のあるB1の5だけ消しておきます。
それから、B1のタテとヨコにある数字をB1の候補から除くとB1の候補に1, 7, 9が残ります。
次にC列に注目するとC6に7があるので、C4, C6には7は入り得ません。
すなわち、C1かC2に7が入るのですが、左上段の3x3ボックスに注目するとC1, C2以外のマスには7が入り得ないことが分かります(いずれにしても理論)。
ここでは、今後の展開に関係のあるB1の7だけ消しておきます。
次に右上部の3x3ボックスに注目します。E2とF2からG2は1,9は取りえません。またI4とI8からI3も1,9を取りえません。つまり残ったG1かI3に1, 9は入ります(セルの予約)。今後関係するG1だけ2から8の候補を消します。
これで準備が整いました。
#解説
下の表は3行目のマスを縦軸に、その取りうる値を横軸にとっています。「はじめに」のところの最後の配置ですでに値の確定している部分に◯、入らない値については✕を入れます。1行目に注目すると、B1とG1に1と9が入ります。つまり下の表の"・"の部分は✕が入ります。このテクニックを「数の予約」と言います。
"・"のところにXを入れた後の状態は次のようになります。