2013年6月5日水曜日

U search memoramdum (7) column_swordfish

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 件のコメント:

コメントを投稿