2009年9月19日土曜日

(47) candy_matrix と M_search

 SUDOKU_Ver32 ( CTM ) は Candy Table Matrix を使った最初のプログラムである。空白セル番号 j である candy matrix , can ( j , i ) は 5+k 個の要素を持つ二次元マトリックスである。

 can ( j , 1 ) = 空白セルの番地、例えば、 ( 3 ,8 )
can ( j , 2 ) = 空白セルの行番号、 3 
can ( j , 3 ) = 空白セルの列番号、 8    
can ( j , 4 ) = 空白セルの属するブロック番号、例えば、中央ブロックは 5
can ( j , 5 ) = 候補の個数、 k 個とする。  
can ( j , 6 ) = 一番目の候補、 a1
can ( j , 7 ) = 二番目の候補、 a2
・・・・・・・・・・・
can ( j , 5+k ) = k 番目の候補、 ak
can matrix に蓄えられる候補の digit は、1 から 9 までの digit の中で小さい数から順に k 個蓄えられるのがプログラム上のポイントである。
can matrix を使った M_search マクロの例を以下に示そう。


Sub M_search()
 empty_cell = Sheets("Sheet1").Range("K2")
For i = 1 To empty_cell
If can(i, 5) = 1 Then
    ii = can(i, 2)
   jj = can(i, 3)
  ak = can(i, 6)
  If Sheets("Sheet1").Cells(ppp + ii, qqq + jj) <> "" Then GoTo contii
  Sheets("Sheet1").Cells(ppp + ii, qqq + jj) = ak
  numa = numa + 1
  Sheets("Sheet6").Cells(numa + 17, 1) = numa - 1
  Sheets("Sheet6").Cells(numa + 17, 2) = "(" & ii & "," & jj & ")"
  Sheets("Sheet6").Cells(numa + 17, 3) = ak
  Sheets("Sheet6").Cells(numa + 17, 4) = sch
  Sheets("Sheet6").Cells(numa + 17, 21) = 0.01 * (Int(100 * (Timer - timer0)))
  Sheets("Sheet6").Range("A18") = numa - 1
  End If
contii:
 Next i
End Sub

M_search の「候補を一つしか持たないセル」は、 can ( j , 5 )= 1 と簡単にあらわすことができるので、マクロの中で四行目だけが重要である。あとは何番目に見つかったかや、その番地や数字、その探索法と時間を記録しているだけである。

0 件のコメント:

コメントを投稿