2013年6月3日月曜日

U search memoramdum (5) select_number

 Select_number は3部屋を占有する組み合わせを求め易くするための、chainr matrixを作るマクロである。

chainb はCandy matrix を拡大したもので、次のサイズを持つ。

ReDim chainb(z + 1, z + 1), chainr(z + 1, z + 1)

z=9 、chainb(0,z+1),  (z+1,0) は、タイトル、(i,z+1),(z+1,j) は候補の数が入る。

matrixを空にする。   Erase chainb, chainr

chainb を作成する。  画面を chainb に移す。
 For i = 1 To z
  For j = 1 To z
   chainb(i, j) = Sheets("Sheet1").Cells(ppp + i, qqq + j)
  Next j
 Next i

 空白セルの候補を、 chainb に書き込む。
 For i = 1 To empty_cell
    ikumi = can(i, 5)
     i1 = can(i, 2): j1 = can(i, 3)
     candidate = ""
       For k = 1 To ikumi
     candidate = candidate & can(i, 5 + k)
       Next k
  chainb(i1, j1) = candidate
 Next i 

chainb の上に、C1,C2・・・ 左端に R1,R2,R3・・・を書き込む。
  For j = 1 To z
 chainb(0, j) = "C" & j
 chainb(j, 0) = "R" & j
  Next j

chainr の作成 chainbより、現在対象としている digit nb を抜き出す。
chainr は特定の候補に絞ったmatrix

For i = 1 To z
 For j = 1 To z
  k = Len(chainb(i, j))
 If k <> 1 Then
  For m = 1 To k
    If Int(Mid(chainb(i, j), m, 1)) = nb Then
    chainr(i, j) = nb
    End If
   Next m
 End If
 Next j
Next i

chainr にタイトルをつける。
For j = 1 To z
 chainr(0, j) = "C" & j
 chainr(j, 0) = "R" & j
Next j 

各行について、nbの数を持つセルの数を数えて、chainr(i,z+1) 一番右端に書き込む。

For i = 1 To z        'row i no kosuu
 num = 0
For j = 1 To z
If chainr(i, j) <> "" Then
num = num + 1
End If
Next j
 chainr(i, z + 1) = num
Next i

各列に対して、同様にセルの数を数えて、chainr (z+1, j) 一番下に書き込む。

For j = 1 To z         'column j no kosuu
 num = 0
For i = 1 To z
If chainr(i, j) <> "" Then
num = num + 1
End If
Next i
 chainr(z + 1, j) = num
Next j

chainr matrix はこのようになる。(Examle U-78 nb=7)


chainc の登場。
chainrを列、行を並び替えて、arranged matrix chainc を作成する。

 Erase chainc
 ReDim chainc(z + 1, z + 1)

行の並び替え。1,2,3、の順に候補の数が少ない順に上からchainc に書き込む。

   num = 0
 For kosu = 1 To z
  For i = 1 To z
 If chainr(i, z + 1) = kosu Then
   num = num + 1
   For j = 0 To z + 1
   chainc(num, j) = chainr(i, j)
   Next j
 End If
  Next i
 Next kosu

行の並び替えが終わると、それを chainr に戻す。
chaincは単なるwork area である。
 For i = 1 To z
  For j = 0 To z + 1
     chainr(i, j) = chainc(i, j)
  Next j
 Next i

同じことを、列に対して行う。

 Erase chainc
 ReDim chainc(z + 1, z + 1)
    num = 0
 For kosu = 1 To z
  For j = 1 To z
 If chainr(z + 1, j) = kosu Then
   num = num + 1
   For i = 0 To z + 1
      chainc(i, num) = chainr(i, j)
   Next i
 End If
  Next j
 Next kosu

列を並び替えた結果をchainc  から chainr に戻す。

 For i = 0 To z + 1
  For j = 1 To z
       chainr(i, j) = chainc(i, j)
  Next j
 Next i

kind="column"の場合にはこのまま終わる。




kind="row"の場合には chainr の転置行列にする。

 If kind = "row" Then
 For i = 0 To z + 1
  For j = 0 To z + 1
       chainc(j, i) = chainr(i, j)
  Next j
 Next i
 For i = 0 To z + 1
  For j = 0 To z + 1
       chainr(i, j) = chainc(i, j)
  Next j
 Next i
 End If



0 件のコメント:

コメントを投稿