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