第8講 4次魔方陣と6次魔方陣の作成

第10話 6次魔方陣コード解説その4(左右線対称移動) 

最後にコード
  '左右下対称移動
  For i = 0 To m - 1
    w = a((i + 1) Mod 3, i)
    a((i + 1) Mod 3, i) = a((i + 1) Mod 3, n - 1 - i)
    a((i + 1) Mod 3, n - 1 - i) = w
  Next
の動きを追いましょう。
まず、a((i + 1) Mod 3, i)は
i=0とのき、a((i + 1) Mod 3, i)=a((0 + 1) Mod 3, 0)=a(1, 0)
i=1とのき、a((i + 1) Mod 3, i)=a((1 + 1) Mod 3, 1)=a(2, 1)
i=2とのき、a((i + 1) Mod 3, i)=a((2 + 1) Mod 3, 2)=a(0, 2)
なので、

   0  1 2 3 4 5
 0 1 2 3  4 5 6
 1 7 8 9 10 11 12
 2 13 14 15 16 17 18
 3 19 20 21 22 23 24
 4 25 26 27 28 29 30
 5 31 32 33 34 35 36

7→14→3と動いていきます。

a((i + 1) Mod 3, n - 1 - i)は
i=0とのき、a((i + 1) Mod 3, n - 1 - i)=a((0 + 1) Mod 3, 6 - 1 - 0)=a(1, 5)
i=1とのき、a((i + 1) Mod 3, n - 1 - i)=a((1 + 1) Mod 3, 6 - 1 - 1)=a(2, 4)
i=2とのき、a((i + 1) Mod 3, n - 1 - i)=a((2 + 1) Mod 3, 6 - 1 - 2)=a(0, 3)
ですから、

   0  1 2 3 4 5
 0 1 2 3  4 5 6
 1 7 8 9 10 11 12
 2 13 14 15 16 17 18
 3 19 20 21 22 23 24
 4 25 26 27 28 29 30
 5 31 32 33 34 35 36

12→17→12と動きます。
結局、最後のコード
  '左右下対称移動
  For i = 0 To m - 1
    w = a((i + 1) Mod 3, i)
    a((i + 1) Mod 3, i) = a((i + 1) Mod 3, n - 1 - i)
    a((i + 1) Mod 3, n - 1 - i) = w
  Next

   0  1 2 3 4 5
 0 1 2 3  4 5 6
 1 7 8 9 10 11 12
 2 13 14 15 16 17 18
 3 19 20 21 22 23 24
 4 25 26 27 28 29 30
 5 31 32 33 34 35 36

の交換となります。

以上、対角線の点対称移動・逆対角線の点対称移動・中央の直線に対する上下線対称移動・中央の直線に対する左右線対称移動
のすべてが遂行され、6次魔方陣が完成します。

'検証
Sub f5(n As Byte)

  Dim i As Byte, j As Byte, w As Byte

  Cells(21, 1) = "検証"
  '6次魔方陣再表示
  For i = 0 To n - 1
    For j = 0 To n - 1
      Cells(22 + i, 1 + j) = a(i, j)
    Next
  Next
  '行合計の算出と表示
  For i = 0 To n - 1
    w = 0
    For j = 0 To n - 1
      w = w + a(i, j)
    Next
    Cells(22 + i, 7) = w
  Next
  '列合計の算出と表示
  For i = 0 To n - 1
    w = 0
    For j = 0 To n - 1
      w = w + a(j, i)
    Next
    Cells(28, 1 + i) = w
  Next
  '対角線合計の算出と表示
  w = 0
  For i = 0 To n - 1
    w = w + a(i, i)
  Next
  Cells(21, 7) = "対角線合計"
  Cells(21, 9) = w
  '対角線合計の算出と表示
  w = 0
  For i = 0 To n - 1
    w = w + a(n - 1 - i, n - 1 - i)
  Next
  Cells(28, 7) = "対角線合計"
  Cells(28, 9) = w

End Sub
の部分は解説していませんが、
皆さんはご自分でトレースしてみましょう。

以上の解説を終わりとして、第8講4次魔方陣と6次魔方陣の作成 を閉じたいと思います。
以後の予定を述べておくと
第9講 For文以外の様々なループ文
第10講 Subプロシージャの再帰的使用
第11講 Funcitonプロシージャの再帰的使用
第12講 高次元ループと高次元配列
第13講 高次元配列と1次元配列の関係
の順に進めていくつもりです。




第9話へ 第9講第1話へ

004


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

数学研究室に戻る