第12講 プロシージャの再帰的使用によって魔方陣を自動生成する
第1話 方陣順列生成プログラム例
コード例
Private Sub CommandButton1_Click()
Dim n As Byte, cn As Integer, x(100) As Byte
n = Cells(3, 11)
cn = 0
Call f(0, cn, n, x())
End Sub
Sub f(g As Byte, cn As Integer, n As Byte, x() As Byte)
Dim h As Byte, i As Byte, j As Byte, k As Byte, a As Byte, s As Integer
a = cn Mod 10
s = Int(cn / 10)
For i = 1 To n * n
x(g) = i
h = 1
If g > 0 Then
For j = 0 To g - 1
If x(j) = x(g) Then
h = 0
Exit For
End If
Next
End If
If h = 1 Then
If g + 1 < n * n Then
Call f(g + 1, cn, n, x())
Else
For j = 0 To n - 1
For k = 0 To n - 1
Cells(5 + j + (n + 1) * s, 2 + k + (n + 1) * a) = x(n * j + k)
Next
Next
cn = cn + 1
End If
End If
Next
End Sub
Private Sub CommandButton2_Click()
Rows("5:20000").Select
Selection.ClearContents
Range("A1").Select
End Sub
参考ファイル
解説
結構難しかったでしょう。
あきらめて答えを見てしまった人も
少なからずいらっしゃったのではないでしょうか。
4行目
For i = 1 To n * n
のn * nは、
n次方陣順列の場合n×nの縦列を作る必要があるからです。
例えば、3次方陣順列なら1辺が3ですから、
3×3=9次の順列が必要です。
ですから、16行目も
If g + 1 < n * n Then
となっている訳です。
さて、順列ができた後それを方陣に並べる訳ですが、
それをやっている場所が
For j = 0 To n - 1
For k = 0 To n - 1
Cells(5 + j + (n + 1) * s, 2 + k + (n + 1) * a) = x(n * j + k)
Next
Next
という訳です。
順列は1次元であるのに対して、
方陣は2次元です。
1次元のものを2次元に並べることに今回の課題の難しさがあるのです。
2次元に並べるには、
For文を入れ子式に使う=2次元のFor文にすれば良いのです。
問題は、jとkとgの関係です。
gというのは、セル番号でした。
ただし、0から数えていることには注意が必要でした。
その関係式が
g = n * j + k
です。
今回は、1次元を2次元に対応させました。
では、配列を
Dim n As Byte, cn As Integer, x(10,10) As Byte
と2次元配列にしたら、
プログラムコードはどのようになるでしょうか。
今回は2次元(j,k)を1次元gに対応させることになるのです。
初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門
数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ