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

第6話 解答1解説

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 + 2) = 4 * (i - 1) + j
        Next
    Next


    For i = 1 To 4
        For j = 1 To 4
            Cells(i + 12, j + 2) = Cells(i + 4, j + 2)
        Next
    Next


    For i = -1 To 1 Step 2
        w = Cells(13, i / 2 + 4.5)
        Cells(13, i / 2 + 4.5) = Cells(16, -i / 2 + 4.5)
        Cells(16, -i / 2 + 4.5) = w
    Next


    For i = -1 To 1 Step 2
        w = Cells(i / 2 + 14.5, 3)
        Cells(i / 2 + 14.5, 3) = Cells(-i / 2 + 14.5, 6)
        Cells(-i / 2 + 14.5, 6) = w
    Next



    Cells(17, 1) = "縦合計"
    For i = 1 To 4
        w = 0
        For j = 1 To 4
            w = w + Cells(j + 12, i + 2)
        Next
        Cells(17, i + 2) = w
    Next

    Range("g10:g12").Select
    Selection.HorizontalAlignment = xlRight
    Cells(10, 7) = "横"
    Cells(11, 7) = "合"
    Cells(12, 7) = "計"
    Range("a1").Select
    For i = 1 To 4
        w = 0
        For j = 1 To 4
            w = w + Cells(i + 12, j + 2)
        Next
        Cells(i + 12, 7) = w
    Next

    Cells(18, 1) = "右斜め対角線合計"
    w = 0
    For i = 1 To 4
        w = w + Cells(i + 12, i + 2)
    Next
    Cells(18, 5) = w

    Cells(19, 1) = "左斜め対角線合計"
    w = 0
    For i = 1 To 4
        w = w + Cells(i + 12, 7 - i)
    Next
    Cells(19, 5) = w

End Sub


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

この紺色の部分では、自然配列

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

を作っています。
次の青色
For i = 1 To 4
    For j = 1 To 4
        Cells(i + 12, j + 2) = Cells(i + 4, j + 2)
    Next
Next

では、その自然配列を8つ下にコピーして

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

を作っています。
次のピンク赤色が今回のメインです。
まず、ピンク
For i = -1 To 1 Step 2
    w = Cells(13, i / 2 + 4.5)
    Cells(13, i / 2 + 4.5) = Cells(16, -i / 2 + 4.5)
    Cells(16, -i / 2 + 4.5) = w
Next

では

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

のピンクの部分を魔方陣の中心の点にたいして点対称移動して、

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

を作成しています。
トレースしてみましょう。
i=−1から始まります。
i=−1のとき、w = Cells(13, i / 2 + 4.5)
w = Cells(13, 4)
です。i/2はi÷2ですので
i=−1のとき、−0.5であるからですよね。以下、
Cells(13, i / 2 + 4.5) = Cells(16, -i / 2 + 4.5)
Cells(16, -i / 2 + 4.5) = w


Cells(13, 4) = Cells(16, 5)
Cells(16, 5) = w
です。
もう一度3行を見てみると、
w = Cells(13, 4)
Cells(13, 4) = Cells(16, 5)
Cells(16, 5) = w
で結局Cells(13, 4)Cells(16, 5)
すなわち

02

15

交換が行われています。

今回は、Step 2がついていますので、i=−1の次はi=1ですから
次のループの3行は
w = Cells(13, 5)
Cells(13, 5) = Cells(16, 4)
Cells(13, 5) = w

ですからCells(13, 5)Cells(16, 4)
すなわち

03

14

の交換が行われています。


次の
For i = -1 To 1 Step 2
    w = Cells(i / 2 + 14.5, 3)
    Cells(i / 2 + 14.5, 3) = Cells(-i / 2 + 14.5, 6)
    Cells(-i / 2 + 14.5, 6) = w
Next

では

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

のピンクの部分を魔方陣の中心の点にたいして点対称移動させて

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

を作り出しているのです。
トレースは是非ご自分でやってみてください。
iに−1と1を代入して動きを追ってみてください。


第5話へ 第7話へ

講義トップへ

数学研究室に戻る