第15講 3次魔方陣と4次魔方陣の作成

第3話 3次魔方陣と4次魔方陣の自動生成

シート例
入門
コード例
Dim mah(4, 4) As Byte, x(16) As Byte, y(16) As Byte
Dim n As Byte, cn As Integer
Private Sub CommandButton1_Click()

  n = Cells(3, 8)
  cn = 0
  zhy
  ms (0)
  Cells(4, 12) = cn

End Sub


Sub zhy()

  Dim i As Byte
  For i = 0 To n * n - 1
    x(i) = i Mod n
    y(i) = Int(i / n)
  Next

End Sub


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 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 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 (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 g + 1 < n * n Then
      ms (g + 1)
    Else
      For j = 0 To n - 1
        For k = 0 To n - 1
          Cells(6 + j + Int(cn / 10) * (n + 1), 1 + k + (cn Mod 10) * (n + 1)) = mah(j, k)
        Next
      Next
      cn = cn + 1
    End If
tobi:
  Next

End Sub

Private Sub CommandButton2_Click()

  Rows("6:2000").Select
  Selection.ClearContents
  Cells(4, 12).Select
  Selection.ClearContents
  Cells(1, 1).Select

End Sub
実行画面
初心者

解説は次話でかなり詳しく行います。
今回のプログラムは力業で4次魔方陣が限界です。
もちろん理論的には、Dim mah(4, 4) As Byte, x(16) As Byte, y(16) As Byteの要素数を大きくとれば、
何次魔方陣でも可能ですが、
4次魔方陣でさえ、すべての計算が終わるまで5分程度要してしまいます。
5次魔方陣になると、作成を100個に限定したとしても20分は軽くかかってしまうでしょう。
私の作った最速の魔方陣作成ソフト魔方陣(細胞構成法)と比べると26次魔方陣あたりなら作成速度は、
1000兆分の1より遙かに低速です。
最速の魔方陣作成ソフト魔方陣(細胞構成法)なら、26次魔方陣でも1秒で数百という単位で魔方陣を作り出してしまいますが、
今回のソフトでは、100年コンピュータを走らせたとしても1個も見つけられないでしょう。
理由は簡単です。26次魔方陣なら、
26!=1×2×3×・・・×26=4.03291461126606E+26(約40000000000000000000000000)通りのすべての場合を調べているからです。
これだとさすがのコンピュータも歯が立たないわけです。
従いまして、今回作ったプログラムは講義の進行とともに改良が加えられ、最終的には30次魔方陣を1秒で数百作り出すソフトまで変身していきます。
今回は本当にはじめの一歩です。

ダウンロード用参考ファイル

第2話へ 第4話へ

004
  


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

数学研究室に戻る