第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話へ

004
  

VBA講義第1部へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ

数学研究室に戻る