第15講 3次魔方陣と4次魔方陣の作成

第8話 3次魔方陣と4次魔方陣の自動生成コード解説その5
コード再掲
Dim mah(4, 4) As Byte, x(16) As Byte, y(16) As Byte
Dim n As Byte, cn As Integer
Private Sub CommandButton1_Click()

  n = Cells(3, 8)
  cn = 0
  zhy
  ms (0)
  Cells(4, 12) = cn

End Sub


Sub zhy()

  Dim i As Byte
  For i = 0 To n * n - 1
    x(i) = i Mod n
    y(i) = Int(i / n)
  Next

End Sub


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 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 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 (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 g + 1 < n * n Then
      ms (g + 1)
    Else
      For j = 0 To n - 1
        For k = 0 To n - 1
          Cells(6 + j + Int(cn / 10) * (n + 1), 1 + k + (cn Mod 10) * (n + 1)) = mah(j, k)
        Next
      Next
      cn = cn + 1
    End If
tobi:
  Next

End Sub

今話では

   0
0  0 1 2
   
1  3 4 5
2  6 7 8
     


これ以降を追います。
すべての検査をクリアしたので、
    If g + 1 < n * n Then
      ms (g + 1)
    Else
      For j = 0 To n - 1
        For k = 0 To n - 1
          Cells(6 + j + Int(cn / 10) * (n + 1), 1 + k + (cn Mod 10) * (n + 1)) = mah(j, k)
        Next
      Next
      cn = cn + 1
    End If
の前半によって次元世界
に飛びます。

   0
0  0 1 2
   
1  3 4 5
2  6 7 8
     

数字の重複検査
    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
に抵触して

   0
0  0 1 2
   
1  3 4 5
2  6 7 8
   


   0
0  0 1 2
   
1  3 4 5
2  6 7 8
   







と動いていって初めて数次の重複検査をクリアします。そして、試験
    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
に該当して、逆対角線合計検査を受けます。残念がながら、合計は18ですでに目標の15を超えています。
したがって、この後
どう動いていっても

   0
0  0 1 2
   
1  3 4 5
2  6 7 8
     


   0
0  0 1 2
   
1  3 4 5
2  6 7 8
     


   0
0  0 1 2
   
1  3 4 5
2  6 7 8
     


   0
0  0 1 2
   
1  3 4 5
2  6 7 8
     


   0
0  0 1 2
   
1  3 4 5
2  6 7 8
     


   0
0  0 1 2
   
1  3 4 5
2  6 7 8
     


















数字の重複検査はクリアできても、逆対角線合計検査はクリアできません。それで1個前の次元世界
8に戻りますが、

   0
0  0 1 2
   
1  3 4 5
2  6 7 8
     

数字の重複検査に抵触して、この次元世界も終了して、次元世界に戻ります。以降、

   0
0  0 1 2
   
1  3 4 5
2  6 7 8
     


   0
0  0 1 2
   
1  3 4 5
2  6 7 8
     


   0
0  0 1 2
   
1  3 4 5
2  6 7 8
     


   0
0  0 1 2
   
1  3 4 5
2  6 7 8
     

















   0
0  0 1 2
   
1  3 4 5
2  6 7 8
     


   0
0  0 1 2
   
1  3 4 5
2  6 7 8
     


   0
0  0 1 2
   
1  3 4 5
2  6 7 8
     


   0
0  0 1 2
   
1  3 4 5
2  6 7 8
     


   0
0  0 1 2
   
1  3 4 5
2  6 7 8
     

















   0
0  0 1 2
   
1  3 4 5
2  6 7 8
     


   0
0  0 1 2
   
1  3 4 5
2  6 7 8
     


   0
0  0 1 2
   
1  3 4 5
2  6 7 8
     


   0
0  0 1 2
   
1  3 4 5
2  6 7 8
     


   0
0  0 1 2
   
1  3 4 5
2  6 7 8
     



   0
0  0 1 2
   
1  3 4 5
2  6 7 8
     



















と動いていくことになります。この調子で解説を続けていくと、後何話もかかります。最終的には、

   0
0  0 1 2
   
1  3 4 5
2  6 7 8
     


までトレースしていかなければなりません。

どうか皆さんご自分でトレースされてみてくさい。


申し訳ありませんが、解説はこれで打ち切り講を変えたいと思います。













第7話へ 第16講第1話へ

004
  


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

数学研究室に戻る