第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 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 5 | 9 | |
1 | 3 | 4 | 5 |
2 | 6 | 7 | |
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
の前半によって次元世界6に飛びます。
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 5 | 9 | |
1 | 3 | 4 | 5 |
2 | 6 | 7 | |
2 | 6 | 7 | 8 |
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
に抵触して
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 5 | 9 | |
1 | 3 | 4 | 5 |
2 | 6 | 7 | |
2 | 6 | 7 | 8 |
2 |
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 5 | 9 | |
1 | 3 | 4 | 5 |
2 | 6 | 7 | |
2 | 6 | 7 | 8 |
3 |
と動いていって初めて数次の重複検査をクリアします。そして、試験
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 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 5 | 9 | |
1 | 3 | 4 | 5 |
2 | 6 | 7 | |
2 | 6 | 7 | 8 |
4 |
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 5 | 9 | |
1 | 3 | 4 | 5 |
2 | 6 | 7 | |
2 | 6 | 7 | 8 |
5 |
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 5 | 9 | |
1 | 3 | 4 | 5 |
2 | 6 | 7 | |
2 | 6 | 7 | 8 |
6 |
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 5 | 9 | |
1 | 3 | 4 | 5 |
2 | 6 | 7 | |
2 | 6 | 7 | 8 |
7 |
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 5 | 9 | |
1 | 3 | 4 | 5 |
2 | 6 | 7 | |
2 | 6 | 7 | 8 |
8 |
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 5 | 9 | |
1 | 3 | 4 | 5 |
2 | 6 | 7 | |
2 | 6 | 7 | 8 |
9 |
数字の重複検査はクリアできても、逆対角線合計検査はクリアできません。それで1個前の次元世界8に戻りますが、
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 5 | 9 | |
1 | 3 | 4 | 5 |
2 | 6 | 9 | |
2 | 6 | 7 | 8 |
数字の重複検査に抵触して、この次元世界も終了して、次元世界7に戻ります。以降、
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 5 | 9 | |
1 | 3 | 4 | 5 |
2 | 7 | ||
2 | 6 | 7 | 8 |
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 5 | 9 | |
1 | 3 | 4 | 5 |
2 | 7 | 8 | |
2 | 6 | 7 | 8 |
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 5 | 9 | |
1 | 3 | 4 | 5 |
2 | 7 | 9 | |
2 | 6 | 7 | 8 |
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 5 | 9 | |
1 | 3 | 4 | 5 |
2 | 8 | ||
2 | 6 | 7 | 8 |
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 5 | 9 | |
1 | 3 | 4 | 5 |
2 | 8 | 1 | |
2 | 6 | 7 | 8 |
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 5 | 9 | |
1 | 3 | 4 | 5 |
2 | 8 | 2 | |
2 | 6 | 7 | 8 |
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 5 | 9 | |
1 | 3 | 4 | 5 |
2 | 8 | 3 | |
2 | 6 | 7 | 8 |
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 5 | 9 | |
1 | 3 | 4 | 5 |
2 | 8 | 4 | |
2 | 6 | 7 | 8 |
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 5 | 9 | |
1 | 3 | 4 | 5 |
2 | 8 | 5 | |
2 | 6 | 7 | 8 |
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 5 | 9 | |
1 | 3 | 4 | 5 |
2 | 8 | 6 | |
2 | 6 | 7 | 8 |
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 5 | 9 | |
1 | 3 | 4 | 5 |
2 | 8 | 7 | |
2 | 6 | 7 | 8 |
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 5 | 9 | |
1 | 3 | 4 | 5 |
2 | 8 | 8 | |
2 | 6 | 7 | 8 |
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 5 | 9 | |
1 | 3 | 4 | 5 |
2 | 8 | 9 | |
2 | 6 | 7 | 8 |
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 5 | 9 | |
1 | 3 | 4 | 5 |
2 | 9 | ||
2 | 6 | 7 | 8 |
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 5 | 9 | |
1 | 3 | 4 | 5 |
3 | |||
2 | 6 | 7 | 8 |
と動いていくことになります。この調子で解説を続けていくと、後何話もかかります。最終的には、
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
8 | 1 | 6 | |
1 | 3 | 4 | 5 |
3 | 5 | 7 | |
2 | 6 | 7 | 8 |
4 | 9 | 2 |
までトレースしていかなければなりません。
どうか皆さんご自分でトレースされてみてくさい。
申し訳ありませんが、解説はこれで打ち切り講を変えたいと思います。
VBA講義第1部へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
数学研究室に戻る