第14講 末項確定法による魔方陣自動生成ソフトの高速化
第2話 1行目(n-1)列目のセルを自動決定させる
0 | 1 | 2 | 3 | |
0 | 0 | 8 | 9 | 4 |
1 | 10 | 1 | 5 | 11 |
2 | 12 | 6 | 2 | 13 |
3 | 7 | 14 | 15 | 3 |
コード変更部分例
Sub f(g As Byte, cn As Integer, n As Byte, x() As Byte, iz() As Byte, jz() As Byte)
Dim h As Byte, i As Byte, j As Byte, k As Byte, a As Byte, s As Integer, gi As Byte, gj As Byte
Dim ji As Byte, jj As Byte, hh As Byte, w As Byte, w1 As Integer, ii As Byte
a = cn Mod 10
s = Int(cn / 10)
gi = iz(g)
gj = jz(g)
If gi = 0 And gj = n - 2 Then
w = 0
For i = 0 To n - 3
w = w + x(0, i)
Next
w = w + x(0, n - 1)
w1 = Int(n * (n * n + 1) / 2) - w
If w1 < 1 Then Exit Sub
If w1 > n * n Then Exit Sub
If n Mod 2 = 0 Then
For i = 0 To 3 * n - 4
If w1 = x(iz(i), jz(i)) Then Exit Sub
Next
End If
If n Mod 2 = 1 Then
For i = 0 To 3 * n - 5
If w1 = x(iz(i), jz(i)) Then Exit Sub
Next
End If
x(gi, gj) = w1
Call f(g + 1, cn, n, x(), iz(), jz())
Exit Sub
End If
ii = Int(n * n * Rnd)
If n = 4 Then kk = 7
If n = 5 Then kk = 24
If n = 6 Then kk = 13
If n = 3 Then kk = 1
For i = 0 To n * n - 1
iii = (ii + kk * i) Mod n * n
x(gi, gj) = iii + 1
・・・
・・・
・・・
参考改良その1ファイル
大変難解なコードですので、
第4話と第5話において詳しく解説します。
さて、改善効果がわかりませんので、
第12講で作った魔方陣自動生成ソフトと今回の改良その1ファイルの両方を改良して、
すべての魔方陣を作り出すまでにかかった時間を計測できるようにしてください。
尚、7040個すべてを作り出すには相当時間がかかりますから、
魔方陣が100個できた段階でプログラムを止めるようにしてください。
また、時間比較のためランダム要素は1回外してください。
初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門
数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ