第14講 末項確定法による魔方陣自動生成ソフトの高速化
第5話 改良ファイル肝の部分の解説その2

コード肝部分再掲
  If gi = 0 And gj = n - 2 Then
    w = 0
    For i = 0 To n - 3
      w = w + x(0, i)
    Next
    w = w + x(0, n - 1)
    w1 = Int(n * (n * n + 1) / 2) - w
    If w1 < 1 Then Exit Sub
    If w1 > n * n Then Exit Sub
    If n Mod 2 = 0 Then
      For i = 0 To 3 * n - 4
        If w1 = x(iz(i), jz(i)) Then Exit Sub
      Next
    End If
    If n Mod 2 = 1 Then
      For i = 0 To 3 * n - 5
        If w1 = x(iz(i), jz(i)) Then Exit Sub
      Next
    End If
    x(gi, gj) = w1
    Call f(g + 1, cn, n, x(), iz(), jz())
    Exit Sub
  End If


次の
    If n Mod 2 = 0 Then
      For i = 0 To 3 * n - 4
        If w1 = x(iz(i), jz(i)) Then Exit Sub
      Next
    End If
    If n Mod 2 = 1 Then
      For i = 0 To 3 * n - 5
        If w1 = x(iz(i), jz(i)) Then Exit Sub
      Next
    End If

では何をしているのでしょうか。
魔方陣の原則に、
同じ数字を複数回使用してはならない、
というものがあります。
ここは、すでに入っている数字と重複がないかを調べています。
場合分けになっている理由は、
偶数の場合は対角線の中央が交差しないのに対して、
奇数の場合は交差するからです。

   0
0 0 8 9 4
1 10 1 5 11
2 12 6 2 13
3 7 14 15 3


0 9 10 11 5
12 1 13 6 14
15 16 2 17 18
19 7 20 3 21
8 22 23 24 4

偶数の場合の3 * n - 4
は4次魔方陣の場合

   0
0 0 8 9 4
1 10 1 5 11
2 12 6 2 13
3 7 14 15 3

セル番号8です。
3*n-4=3×4-4=8
ですよね。
セル番号9に入れる候補が、
セル番号0から8までのセルに
入っている数字と重複していないかを調べています。
奇数の場合の3 * n - 5
は5次魔方陣なら

0 9 10 11 5
12 1 13 6 14
15 16 2 17 18
19 7 20 3 21
8 22 23 24 4

セル番号10です。
実際、
3*n-5=3×5-5=10ですね。

以上の重複検査をクリアした場合のみ、
    x(gi, gj) = w1
によってはじめて1行目(n-1)列目に候補数字が入れられます。
重複している場合は前のセルに戻ってやり直すため
        If w1 = x(iz(i), jz(i)) Then Exit Sub
        If w1 = x(iz(i), jz(i)) Then Exit Sub

となっているわけです。
    Call f(g + 1, cn, n, x(), iz(), jz())
ではnの2乗より大きくない、1より小さくない、
今まで入っているセルと数字の重複がない、
の検査をすべてパスしていますので、
次のセルに進んで良いわけです。
最後の
    Exit Sub
をうっかり忘れると、
Sub f(g As Byte, cn As Integer, n As Byte, x() As Byte, iz() As Byte, jz() As Byte)
        ・・・
        ・・・
        ・・・
以降が実行されてしまい、
無駄な試行錯誤をすることになります。

以上で解説は終了します。
では、次の段階に進みましょう。
1列目(n-1)行目の改善を行ってください。
4次魔方陣なら

   0
0 0 8 9 4
1 10 1 5 11
2 12 6 2 13
3 7 14 15 3

セル番号12、5次魔方陣なら

0 9 10 11 5
12 1 13 6 14
15 16 2 17 18
19 7 20 3 21
8 22 23 24 4

セル番号19に相当します。



第4話へ 第6話へ



トップ

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

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