第14講 末項確定法による魔方陣自動生成ソフトの高速化
第7話 時間計測版改良その3

コード改良部分

Sub f(g As Byte, cn As Integer, n As Byte, x() As Byte, iz() As Byte, jz() As Byte)
           ・・・
           ・・・
           ・・・
  If gi = n - 2 And gj = 0 Then
    w = 0
    For i = 0 To n - 3
      w = w + x(i, 0)
    Next
    w = w + x(n - 1, 0)
    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 4 * n - 6
        If w1 = x(iz(i), jz(i)) Then Exit Sub
      Next
    End If
    If n Mod 2 = 1 Then
      For i = 0 To 4 * 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
  If (gi > 0 And gi < n - 1) And gj = n - 1 Then
    w = 0
    For i = 0 To n - 2
      w = w + x(gi, i)
    Next
    w1 = Int(n * (n * n + 1) / 2) - w
    If w1 < 1 Then Exit Sub
    If w1 > n * n Then Exit Sub
    For i = 0 To g - 1
      If w1 = x(iz(i), jz(i)) Then Exit Sub
    Next
    x(gi, gj) = w1
    Call f(g + 1, cn, n, x(), iz(), jz())
    Exit Sub
  End If
           ・・・
           ・・・
           ・・・
参考ファイル
時間計測版改良その3

実験結果
改良前
改良前
改良その1
新
改良その2
新
改良その3
新
改良前と比較して11/3.2≒3.4倍加に成功しています。

いよいよ最後の改良です。

   0
0 0 8 9 4
1 10 1 5 11
2 12 6 2 13
3 7 14 15 3


0 9 10 11 5
12 1 13 6 14
15 16 2 17 18
19 7 20 3 21
8 22 23 24 4

薄い緑すなわち2列目から(n-1)列目までのn行目を改善しましょう。
この改良で魔方陣末項確定法自動生成ソフトが完成します。
(今回改良してみて
    If n Mod 2 = 0 Then
      For i = 0 To 4 * n - 6
        If w1 = x(iz(i), jz(i)) Then Exit Sub
      Next
    End If
    If n Mod 2 = 1 Then
      For i = 0 To 4 * n - 5
        If w1 = x(iz(i), jz(i)) Then Exit Sub
      Next
    End If

    For i = 0 To g - 1
      If w1 = x(iz(i), jz(i)) Then Exit Sub
    Next

とシンプルなものにできることに気がつきました。
次回はここも改良します。)



第6話へ 第8話へ



トップ

初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門

数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ