chainr matrix より縮小したjun matrix が作成された。次のステップとして、room に応じたmatrixの形式を選別する。例えば、swordfish は、room=3 であるが、3行でswordfishを構成するにはroomより少ない候補を持つセルでも成立する。
(2,2,2) (2,2,3) (2,3,3) (3,3,3) などである。ここで、列・行を候補の数が少ない順にわざわざ並べ替えた意味がわかるだろう。room=3の場合には、上に示した4つのケースに絞られる。
jun matrix より、room_selection マクロにより、swordfish に該当するmatrix が jnn matrixとして、導かれる。
column_swordfish は、jun matrix より、次のようにあらゆる組み合わせを検定して、抽出する。
'
Sub column_swordfish()
ksum = jun(z + 1, 0)
For i9 = 1 To ksum
For j9 = i9 + 1 To ksum
For k9 = j9 + 1 To ksum
For m = 0 To z + 1
jnn(m, 0) = jun(m, 0)
jnn(m, 1) = jun(m, i9)
jnn(m, 2) = jun(m, j9)
jnn(m, 3) = jun(m, k9)
Next m
room_selection
Next k9
Next j9
Next i9
End Sub
ある組み合わせが該当するかどうかを調べる。
Sub room_selection()
各行に対して候補を持つセルの数を調べて jnn の room+1列目に書き込む。
For i3 = 1 To z
inum = 0
For j3 = 1 To room
If jnn(i3, j3) <> "" Then
inum = inum + 1
End If
Next j3
jnn(i3, room + 1) = inum
Next i3
該当する行の数を jnn matrix の右下のセル (z+1,room+1)にかきこむ。
knum = 0
For i4 = 1 To z
If jnn(i4, room + 1) <> 0 Then
knum = knum + 1
End If
Next i4
jnn(z + 1, room + 1) = knum
判定条件は、この数が、room に一致することである。
If knum > room Then
Exit Sub
ElseIf knum = room Then
該当する jnn matrix をoutput する。
For i5 = 0 To z + 1
For j5 = 0 To room + 1
Sheets("Sheet8").Cells(6 + i5, 63 + room + j5) = jnn(i5, j5)
Next j5
Next i5
jnn matrix(z+1, room+1) の output は次のようになります。
そして、つぎのマクロで、この同列にあるこの行の候補数字を消去する。
column_fish_room_division
Else
MsgBox ("Qurious Case to be noticed !")
Exit Sub
End If
End Sub
'
0 件のコメント:
コメントを投稿