第16講 魔方陣作成の高速化(数万倍へ)

第4話 魔方陣作成マクロVer.2の暫定完成
コード例
Sub ms(g As Byte)

  Dim i As Byte, j As Byte, k As Byte, a As Byte, b As Byte, w As Byte
  a = x(g)
  b = y(g)

  For i = 0 To n * n - 1
    mah(b, a) = i + 1
    If g > 0 Then
      For j = 0 To g - 1
        If mah(b, a) = mah(y(j), x(j)) Then GoTo tobi
      Next
    End If
    If (a = n - 1) And (b = n - 1) Then
      w = 0
      For j = 0 To n - 1
        w = w + mah(j, j)
      Next
      If w <> Int(n * (n * n + 1) / 2) Then GoTo tobi
    End If
    If (a = 0) And (b = n - 1) Then
      w = 0
      For j = 0 To n - 1
        w = w + mah(j, n - 1 - j)
      Next
      If w <> Int(n * (n * n + 1) / 2) Then GoTo tobi
    End If
    If (b = 0) And (a = n - 2) Then
      w = 0
      For j = 0 To n - 1
        w = w + mah(b, j)
      Nex
      If w <> Int(n * (n * n + 1) / 2) Then GoTo tobi
    End If
    If (a = 0) And (b = n - 2) Then
      w = 0
      For j = 0 To n - 1
        w = w + mah(j, a)
      Next
      If w <> Int(n * (n * n + 1) / 2) Then GoTo tobi
    End If
    If (b < n - 1) And (b > 0) And (a = n - 1) Then
      w = 0
      For j = 0 To n - 1
        w = w + mah(b, j)
        Next
        If w <> Int(n * (n * n + 1) / 2) Then GoTo tobi
      End If
      If (a < n - 1) And (a > 0) And (b = n - 1) Then
        w = 0
        For j = 0 To n - 1
          w = w + mah(j, a)
        Next
        If w <> Int(n * (n * n + 1) / 2) Then GoTo tobi
      End If
      If g + 1 < n * n Then
        ms (g + 1)
      Else
      For j = 0 To n - 1
        For k = 0 To n - 1
          Cells(6 + k + Int(cn / 10) * (n + 1), 1 + j + (cn Mod 10) * (n + 1)) = mah(j, k)
        Next
      Next
      cn = cn + 1
    End If
tobi:
  Next

End Sub

これで一応魔方陣の高速化に成功して、時間はかかるものの5次までは作成できるようになりました。
現時点では、6次は出来そうにないように見えますが、実は小改良で6次まで出来るようにないます。
その小改良とは、数字を順に入れていくのではなくランダムに入れることです。
現在は、番号gに対応するセルには、6次魔方陣なら
1,2,3,4,5,・・・,15,16といれていますが、その始まりをランダム化して、
5,6,7,・・・,16,1,2,3,4や
11,12,13,14,15,16,1,2,3,・・・,10などと出来るとより高速に出来ます。
皆さん考えてみましょう。
コード例は次話で。
尚、第3話と第4話のコード解説は第5話以降で行います。

第3話へ 第5話へ

004
  


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

数学研究室に戻る