第17講 末項確定法(魔方陣作成マクロVer.3)への挑戦
第2話 末項確定法(Ver.3)暫定完成!
コード
Sub ms(g As Byte)
Dim i As Integer, j As Byte, k As Byte, a As Byte, b As Byte, w As Integer,
sa As Integer, h As Byte
Dim ii As Integer, iii As Integer, kk As Byte
a = x(g)
b = y(g)
If a = n - 1 And b = n - 1 Then
w = 0
For i = 0 To n - 2
w = w + mah(i, i)
Next
sa = Int(n * (n * n + 1) / 2) - w
If sa < 1 Or sa > n * n Then Exit Sub
If p(sa - 1) = 1 Then Exit Sub
mah(b, a) = sa
p(sa - 1) = 1
ms (g + 1)
p(sa - 1) = 0
Exit Sub
End If
If a = 0 And b = n - 1 Then
w = 0
For i = 0 To n - 2
w = w + mah(i, n - 1 - i)
Next
sa = Int(n * (n * n + 1) / 2) - w
If sa < 1 Or sa > n * n Then Exit Sub
If p(sa - 1) = 1 Then Exit Sub
mah(b, a) = sa
p(sa - 1) = 1
ms (g + 1)
p(sa - 1) = 0
Exit Sub
End If
If a = n - 2 And b = 0 Then
w = 0
For i = 0 To n - 3
w = w + mah(b, i)
Next
w = w + mah(b, n - 1)
sa = Int(n * (n * n + 1) / 2) - w
If sa < 1 Or sa > n * n Then Exit Sub
If p(sa - 1) = 1 Then Exit Sub
mah(b, a) = sa
p(sa - 1) = 1
ms (g + 1)
p(sa - 1) = 0
Exit Sub
End If
If a = 0 And b = n - 2 Then
w = 0
For i = 0 To n - 3
w = w + mah(i, a)
Next
w = w + mah(n - 1, a)
sa = Int(n * (n * n + 1) / 2) - w
If sa < 1 Or sa > n * n Then Exit Sub
If p(sa - 1) = 1 Then Exit Sub
mah(b, a) = sa
p(sa - 1) = 1
ms (g + 1)
p(sa - 1) = 0
Exit Sub
End If
If a = n - 1 And b > 0 And b < n - 1 Then
w = 0
For i = 0 To n - 2
w = w + mah(b, i)
Next
sa = Int(n * (n * n + 1) / 2) - w
If sa < 1 Or sa > n * n Then Exit Sub
If p(sa - 1) = 1 Then Exit Sub
mah(b, a) = sa
p(sa - 1) = 1
ms (g + 1)
p(sa - 1) = 0
Exit Sub
End If
If a > 0 And a < n - 1 And b = n - 1 Then
w = 0
For i = 0 To n - 2
w = w + mah(i, a)
Next
sa = Int(n * (n * n + 1) / 2) - w
If sa < 1 Or sa > n * n Then Exit Sub
If p(sa - 1) = 1 Then Exit Sub
mah(b, a) = sa
p(sa - 1) = 1
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
Cells(4, 12) = cn
End If
p(sa - 1) = 0
Exit Sub
End If
・
・
・
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
ms (g + 1)
tobi:
If h = 1 Then p(mah(b, a) - 1) = 0
Next
End Sub
Ver.3でかなり高速になりました。
暫定完成としたのは、検索の仕方が変わっているので、
Rnd (-1)
If n = 4 Then Randomize (219)
If n = 5 Then Randomize
(56)
If n = 6 Then Randomize (400)
や
If n = 4 Then kk = 7
If n = 5 Then kk = 24
If n = 6 Then kk = 13
は意味がありません。
再度、自動実験を行いそれらの最適数字を探さなければなりません。
皆さん、自動実験のコードを考えましょう。
解答例は、次話で示します。
完成した暁には、Ver.2とVer.3の時間計測をしてどのぐらい速くなったかを確認します。
それが第4話の課題です。
尚、コード解説は第5話以降で詳しく行います。
第1話へ 第3話へ
VBA講義第1部へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
数学研究室に戻る