Sudoku(数独) を Mathematicaで解く(8): Main(1)

目次へ

8.1 NakedSingleの探索を繰り返す

前回の(7) で示した code1,code2,code3,code4 の後に、これから示す Main を追加して、NakedSingleの探索を繰り返すプログラムを作ります。このプログラムの構造は(6)で示した図になります。

Step0: 初期定義

(* main *)
(* begin{Section}   *)
(* begin{Subsection}: Step0:ini の定義 *)
ini=Module[{b},{
{b,7,b,  b,b,b,  5,b,b},
{5,3,1,  b,b,b,  4,b,b},
{8,b,b,  6,4,b,  b,b,b},
{b,2,b,  b,b,4,  b,3,5},
{b,1,b,  b,b,b,  b,6,b},
{9,4,b,  1,b,b,  b,7,b},
{b,b,b,  b,2,3,  b,b,1},
{b,b,3,  b,b,b,  8,9,2},
{b,b,7,  b,b,b,  b,4,b}}/.b->Null]; 

Show[Rasterize[plotGame[ini]],ImageSize ->250]

Step1: ini->ini2

ゲームの行列 (ini) から、 findNakedSiggle で見つかった答えをブランクに埋めて次の行列 (ini2) を求める。

(* begin{Subsection}: Step1: ini -> ini2 *)
mapini=makeMap[ini];
findNakedSingle[mapini]
⇒ {{9, {3, 2}}, {2, {6, 7}}, {8, {6, 9}}, {5, {7, 8}}}
ini2=makeMatrixByNakedSingle[ini];
(* end{Subsection}: Step1: ini -> ini2 *) 

Step2: in2->ini3

更新された行列 ini2 について findNakedSingle を使って答えを探す。

(* begin{Subsection}: Step2:ini2 -> ini3  *)
mapini2=makeMap[ini2];
findNakedSingle[mapini2]
⇒ {{2,{3,3}},{9,{5,7}}}
ini3=makeMatrixByNakedSingle[ini2];
(* end{Subsection}: Step2:ini2 -> ini3  *)

Step3: in3->ini4

(* begin{Subsection}: Step3:ini3 -> ini4  *)
mapini3=makeMap[ini3];
findNakedSingle[mapini3]
⇒ {{1,{3,8}},{1,{4,7}},{4,{5,9}}}
ini4=makeMatrixByNakedSingle[ini3];
(* end{Subsection}: Step3:ini3 -> ini4 *)

Step4: in4 No NakedSingles

findNakrdSingle で答えが見つからない。

(* begin{Subsection}: Step4:ini4  No NakedSingles  *)
mapini4=makeMap[ini4];
findNakedSingle[mapini4]
⇒ {}
Show[Rasterize[plotMapGridsColoredByNakedSingle[ini4]],ImageSize->350] 
(* end{Subsection}: Step4:ini4 No NakedSingle *)
(* end{Section} *)

これを解決する方法として「Hidden Single (隠れたシングル) を探す方法」を次回に説明します。

目次へ