読者です 読者をやめる 読者になる 読者になる

Sudoku(数独) を Mathematicaで解く(2): 候補図(map)

Mathematica Sudoku

目次へ

2. 候補図(map)の説明

(1) で示したブランクに入れるべき候補の図について説明します。

 これを表現するデータは次になります。9行9列の行列の要素がリストになっています。

mapini=
{{{2,4,6},{},{2,4,6,9},{2,3,8,9},{1,3,8,9},{1,2,8,9},{},{1,2,8},{3,6,8,9}}, {{},{},{},{2,7,8,9},{7,8,9},{2,7,8,9},{},{2,8},{6,7,8,9}}, {{},{9},{2,9},{},{},{1,2,5,7,9},{1,2,3,7,9},{1,2},{3,7,9}}, {{6,7},{},{6,8},{7,8,9},{6,7,8,9},{},{1,9},{},{}}, {{3,7},{},{5,8},{2,3,5,7,8,9},{3,5,7,8,9},{2,5,7,8,9},{2,9},{},{4,8,9}},
{{},{},{5,6,8},{},{3,5,6,8},{2,5,6,8},{2},{},{8}},
{{4,6},{5,6,8,9},{4,5,6,8,9},{4,5,7,8,9},{},{},{6,7},{5},{}},
{{1,4,6},{5,6},{},{4,5,7},{1,5,6,7},{1,5,6,7},{},{},{}},
{{1,2,6},{5,6,8,9},{},{5,8,9},{1,5,6,8,9},{1,5,6,8,9},{3,6},{},{3,6}}};

1行1列の候補はリスト { 2,4,6 } で、1行2列の候補は無いのでリスト { } で表現されます。今後、出力結果を ⇒ で示すことにします。

mapini[[1,1]]
⇒ {2,4,6}
mapini[[1,2]]
⇒ {}

この mapini を図のように描く関数 plotMapGrid は以下になります。関数 Grid のオプションについてはドキュメントセンターを読んで解釈してください。

gridBox[lst_List]:=Grid[Partition[ReplacePart[Table[blank,{9}],Thread[lst->lst]],3]/.blank->Null]

plotMapGrid[ini_?MatrixQ,mapini_List]:=Module[{numbers,grids,mapgrid},
  numbers=DeleteCases[Flatten[Table[If[ini[[i,j]]=!=Null,{i,j}->ini[[i,j]],"aa"],{i,1,9},{j,1,9}],1],_?StringQ];
  grids=Table[gridBox[mapini[[i,j]]],{i,1,9},{j,1,9}]; 
  mapgrid=ReplacePart[grids,numbers];
  Grid[mapgrid,
  ItemStyle->
  {Directive[Blue,13,Bold],Automatic,Thread[numbers[[All,1]]->Table[Directive[Blue,30,Bold],{Length[numbers]}]]},
  ItemSize->{3.0,3.6},
  Dividers ->{{{Thickness[2],True,True}},{{Thickness[2],True,True}}},
  Background ->{Automatic,Automatic,
  Flatten[Table[{i, j} -> If[EvenQ[Plus @@ Floor[{i - 1, j - 1}/3]], 
  LightGreen, White], {i, 9}, {j, 9}]]}] ]

次で図を描くことができます。ただし、答えを示す赤い文字を描きません。一工夫が必要です。

plotMapGrid[ini, mapini]

関数 Grid のオプションについてはドキュメントセンターに説明と例が書いてあります。「 例題」の「おもしろい例題」の中に、「数独の格子」の具体例あり、これを参考にした。

http://reference.wolfram.com/mathematica/ref/Grid.ja.html

続く

データ( ini )から候補図( mapini )の求め方は次回で説明します。

目次へ