第12講 プロシージャの再帰的使用によって魔方陣を自動生成する
第1話 方陣順列生成プログラム例

2次方陣順列

コード例
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に対応させることになるのです。

第11講第7話へ 第2話へ



トップ

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

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