第6講 4次魔方陣を作ってみよう。

第2話 4次魔方陣プログラム

4次魔方陣プログラム解答例

プログラム解説
実行プログラムは次のようになっています。

Private Sub CommandButton1_Click()

    Dim i As Integer, j As Integer, w As Integer

    For i = 1 To 4
        For j = 1 To 4
            Cells(i + 4, j + 1) = 4 * (i - 1) + j
        Next
    Next

    For i = 1 To 2
        w = Cells(i + 4, i + 1)
        Cells(i + 4, i + 1) = Cells(9 - i, 6 - i)
        Cells(9 - i, 6 - i) = w
    Next

    For i = 1 To 2
        w = Cells(i + 4, 6 - i)
        Cells(i + 4, 6 - i) = Cells(9 - i, i + 1)
        Cells(9 - i, i + 1) = w
    Next

End Sub

最初の2次元ループ
For i = 1 To 4
    For j = 1 To 4
        Cells(i + 4, j + 1) = 4 * (i - 1) + j
    Next
Next
では、自然配列を作成しています。

そして、以降2つの2次元ループで対角線上の値を交換しています。
2個目の2次元ループ
For i = 1 To 2
    w = Cells(i + 4, i + 1)
    Cells(i + 4, i + 1) = Cells(9 - i, 6 - i)
    Cells(9 - i, 6 - i) = w
Next
では、

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

のピンクの部分を交換しています。
わかりにくいと思いますので
トレースしてみましょう。
まず、i=1から始まりますから、
w = Cells(5, 2)
Cells(5, 2) = Cells(8, 5)
Cells(8, 2) = w
で表のCells(5, 2)とCells(8, 5)すなわち1と16が交換されます。
i=2のときは、
w = Cells(6, 3)
Cells(6, 3) = Cells(7, 4)
Cells(7, 4) = w
ですからCells(6, 3)とCells(7, 4)すなわち6と11が交換されます。
Cells(9 - i, 6 - i)がわかりにくいと思いますが、
対角線の下側から中心に向かって動いていくようになっています。
Cells(i + 4, i + 1)の動きと反対方向にしたいときは、
iを−iとすればよいわけです。

3個目の2次元ループ
For i = 1 To 2
    w = Cells(i + 4, 6 - i)
    Cells(i + 4, 6 - i) = Cells(9 - i, i + 1)
    Cells(9 - i, i + 1) = w
Next
についてはもうおわかりでしょう。

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

のピンクの部分を交換しています。

以上の流れをスローモーションで再現したプログラムが次のものです。
再現プログラム
スローモーション再生と上の説明をよくご覧になり、
ご自分で是非トレースをなさってみてください。
(尚、再現プログラムのプログラムソースは現時点ではご覧にならないことをお勧めします。
まだ、解説していないコードをたくさん利用しているからです。)

では皆さん、4次魔方陣プログラム解答例をさらに改良して
すべての行と列と対角線の合計も表示させるプログラムを考えましょう。

第1話へ 第3話へ

講義トップへ

数学研究室に戻る