第14講 4次及び6次魔方陣の作成
第10話 左右・上下対称移動解説

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

左右対称移動及び上下対称移動対応コード
  public static void i(int a[][]){
    int i,w;
    for(i=0;i<3;i++){
      w=a[i][(i+2)%3];
      a[i][(i+2)%3]=a[i][5-(i+2)%3];
      a[i][5-(i+2)%3]=w;
    }
  }
  public static void j(int a[][]){
    int i,w;
    for(i=0;i<3;i++){
      w=a[i][(i+1)%3];
      a[i][(i+1)%3]=a[5-i][(i+1)%3];
      a[5-i][(i+1)%3]=w;
    }
  }

  0 1 2
0 36 2 3
1 7 29 9
2 13 14 22

線対称移動プログラムの一番肝要な点は、
左右対称移動の場合は、のセルをいかに実現するか、
上下対称移動なら、薄緑のセルをどのようになぞるか、
が問題です。
幸いなことに点対称移動を含めて、
3つの移動に対応する色の法則は共通のものがあります。
いずれも斜め下に下がるです。
ただし、線対称移動の場合は途中で右端にぶつかってしまいます。
そのときは、一番左端に移動すればよいのです。

のセルをいかに実現できるでしょうか。
座標の動きは簡単です。
012
座標は
201
と動きます。
この動きを実現するのが、(i+2)%3です。
a%bの式は、aをbで割ったときの余りを求めるものです。
実際に、iに0、1、2と代入してみましょう。
(i+2)%3=(0+2)%3=2%3=2
(i+2)%3=(1+2)%3=3%3=0
(i+2)%3=(2+2)%3=4%3=1
というわけで、
201
の動きを実現しています。

この動きを実現できれば、

  0 1 2 3 4 5
0 36 2 3  4 5 33
1 7 29 9 10 27 12
2 13 14 22 21 17 18

左右の対称移動は簡単です。
交換すべきセルの座標は、()と(5-x)です。
つまり、座標
i(i+2)%3)と(i5-(i+2)%3)の交換です。
      w=a[i][(i+2)%3];
      a[i][(i+2)%3]=a[i][5-(i+2)%3];
      a[i][5-(i+2)%3]=w;
この3行で該当セルの交換が行われ

  0 1 2 3 4 5
0 36 2 4  3 5 33
1 12 29 9 10 27 7
2 13 17 22 21 14 18

の実現に成功します。

次は薄緑セル座標の動きを見ましょう。

  0 1 2
0 36 2 3
1 7 29 9
2 13 14 22

座標は
012
座標は
120
と動きます。
120をいかに実現すべきは、簡単ですね。
(i+1)%3ですね。
交換すべきセル座標は、()と(5-y)です。
つまり、座標
i(i+2)%3)と(5-i(i+2)%3)の交換です。
したがいまして、
      w=a[i][(i+1)%3];
      a[i][(i+1)%3]=a[5-i][(i+1)%3];
      a[5-i][(i+1)%3]=w;
の3行で

  0 1 2
0 36 2 3
1 7 29 9
2 13 14 22
3 19 20 16
4 25 11 27
5 6 32 33

の該当セルが交換され、

  0 1 2
0 36 32 3
1 7 29 27
2 19 14 22
3 13 20 16
4 25 11 9
5 6 2 33

が実現できるのです。
以上の解説を通して、
呪文のように難しかったコードの意味が、明瞭に掴めたのではないでしょうか。

次講は、クラスの学習その2=public、private、staticの意味です。


第9話へ 第15講第1話へ

戻る

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

初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第1部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第2部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第3部