2009年9月20日日曜日

(48) g matrix を作るマクロ

 SUDOKU_Ver.33 において、初めて g matrix が作成され、使用された。g matrix は gg_matrix , gl_matrix , gc_matrix よりなる。いずれも 1 から 9 までの任意の数字 ( numb ) が、あるブロック ( igrp ) あるいは、ある行 ( ilin ) あるいは、ある列 ( icol ) に存在する空白セルがいくつ、どこにあるかを表す三次元 matrix である。

gg_matrix を例にとり、その内容を示そう。

gg ( igrp , numb , 1 ) = igrp 数字の存在するブロック番号
gg ( igrp , numb , 2 ) = num  digit が numb のそのブロックに存在する空白セルの数
gg ( igrp , numb , 3 ) = ( i1, j1 ) : num = 1  候補 numb をもつ一番目の空白セルの位置
gg ( igrp , numb , 4 ) = ( i2 ,j2 ) : num = 2  候補 numb をもつ二番目の空白セルの位置
・・・・・・・・・・・
gg ( igrp , numb , 2+num ) = ( inum , jnum ) 候補 numb をもつ num 番目の空白セルの位置

gg_matrix は、 can matrix よりつくられる。そのマクロ block_number_table を次に示す。

Sub block_number_table ( )
  ReDim gg(z, z, z + 2)
ReDim xi(z), yi(z), bz(z)
For i = 1 To z
For j = 1 To z
For k = 1 To z + 2
gg ( i , j , k ) = " "
Next k
Next j
Next i
empty_cell = Sheets("Sheet1").Range("K2")
For numb = 1 To z
For igrp = 1 To z
num = 0
For i = 1 To empty_cell
If can(i, 4) <> igrp Then GoTo conti
ikumi = can(i, 5)
For j = 1 To ikumi
If numb = can(i, 5 + j) Then
num = num + 1
xi(num) = can(i, 2): yi(num) = can(i, 3)
bz(num) = can(i, 1)
End If
Next j
conti:
Next i
gg(igrp, numb, 1) = igrp
gg(igrp, numb, 2) = num
For k = 1 To num
gg(igrp, numb, 2 + k) = bz(k)
Next k
Next igrp
Next numb
End Sub

0 件のコメント:

コメントを投稿