第18講 一般種法×末項確定法(魔方陣作成マクロVer.4)への挑戦

第5話 番号付けコード例解説その2
ここでは、
Dim mah(12, 12) As Byte, x(144) As Byte, y(144) As Byte, p(144) As Byte, a(12, 12) As Integer
Dim n As Byte, cn As Integer, gk As Integer
Private Sub CommandButton1_Click()
  Dim i, j As Integer
  n = Cells(3, 8)
  Rnd (-1)
  syokika
  zhy
  zhy1 (0)
  zhykakunin
  'ms (0)
End Sub

Sub syokika()
  Dim i As Byte
  Dim j As Byte
  For i = 0 To n * n - 1
    p(i) = 0
  Next
  sk = 0
  cn = 0
  gk = n
  For i = 0 To n - 1
    For j = 0 To n - 1
      a(i, j) = -1
    Next
  Next
End Sub
までを解説しましょう。

まず、1行目
Dim mah(12, 12) As Byte, x(144) As Byte, y(144) As Byte, p(144) As Byte, a(12, 12) As Integer
の各配列の要素数が大きくなっているのは、
一般種法を取り入れることによって、処理速度は数十倍から何百万倍も速くなります。
倍数にかなりの幅がある理由は、魔方陣の次数によって効果が違うからです。
もちろん、次数が大きいほど効果は大きくなります。
処理速度は、著しく速くなるために12次魔方陣までは少なくとも処理できるようになるのです。
乱数系列を工夫すれば、13次、14次でも可能ですが、一応12次までとしておきます。

Rnd (-1)は乱数の初期化です。
これは今回は必要ありませんが、後に乱数系列最適実験をしてそれぞれの次数に適したシード値を選びますので、
その時にこれが必要になります。
シード値を指定しても、その前にRnd (-1)によって乱数を初期化しておかないと無効であるからです。

今回の眼目は、
  gk = n
  For i = 0 To n - 1
    For j = 0 To n - 1
      a(i, j) = -1
    Next
  Next
にあります。番号付けのための準備です。

-1 -1 -1 -1
-1 -1 -1 -1
-1 -1 -1 -1
-1 -1 -1 -1



4
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
4 -1 -1 -1 -1 -1





















なぜ、これが必要なのでしょうか。それは本番号を見ていただければわかります。

10 12
11 14
13 15



4
10 11
12 15 16
13 17 19 20
14 21 23
4 18 22 24





















例えば、5次の場合の2に注目して下さい。
0→1→2→3→4→5→6→・・・
の順にいれていきますが、何の工夫もないと2が7に置き換わってしまいます。
それを防ぐために、番号としてはあり得ない−1を入れているのです。
番号は、0から始まるからです。
あり得なければ何でもよいのでa(i, j) = -1は−1である必要はありません。
−2でもよいのです。その場合の後のIf文は
    If a(i, n - 1 - i) = -2 Then
      a(i, n - 1 - i) = gk
      gk = gk + 1
    End If
となります。

つまり、本番号でない−1の場合は番号を入れなさいということなのです。
このことによって、すでに入っている本番号を上書きしてしまう心配がなくなるのです。




第4話へ 第6話へ

004
  

VBA講義第1部へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ

数学研究室に戻る