第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話へ
VBA講義第1部へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
数学研究室に戻る