第8講 4次魔方陣と6次魔方陣の作成
第9話 6次魔方陣生成アプリ交換プログラムコードの解説
  //左右線対称移動
  for(i=0;i<3;i++){
    w=x[i][(i+2)%3];
    x[i][(i+2)%3]=x[i][5-(i+2)%3];
    x[i][5-(i+2)%3]=w;
  }
について解説します。

まず、(i+2)%3についてトレースしましょう。
i=0のとき

 (i+2)%3=(0+2)%3=2%3=2
i=1のとき
 (i+2)%3=(1+2)%3=3%3=0
i=2のとき
 (i+2)%3=(2+2)%3=4%3=1

次に
  //左右線対称移動
  for(i=0;i<3;i++){
    w=x[i][(i+2)%3];
    x[i][(i+2)%3]=x[i][5-(i+2)%3];
    x[i][5-(i+2)%3]=w;
  }
をトレースしてみましょう。
くどいようですが、第6話の注意をもう一度書いておきます。

プログラミングでは行(横列)→列(縦列)の順で考えますから、
座標(
)は、が行番号(縦軸)に対応し、
が列番号(横軸)に対応しています。
数学の座標は(横軸、縦軸)であるのとは反対で(
縦軸横軸)となっています。
ですから、 座標()は

  0
0
1
2 10 11 12
3 13 14 15 16

茶色のセル(ます)をあらわします。
すなわち、10が入っているセル(ます)です。


i=0のとき

    w=x[i][(i+2)%3];
    x[i][(i+2)%3]=x[i][5-(i+2)%3];
    x[i][5-(i+2)%3]=w;
 はそれぞれ
    w=x[0][(0+2)%3];
    x[0][(0+2)%3]=x[0][5-(0+2)%3];
    x[0][5-(0+2)%3]=w;
 すなわち、
    w=x[0][2];
    x[0][2]=x[0][3];
    x[0][3]=w;
 ですから、

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

 の茶色部分が交換されて、

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

 となります。

i=1のとき
    w=x[i][(i+2)%3];
    x[i][(i+2)%3]=x[i][5-(i+2)%3];
    x[i][5-(i+2)%3]=w;
 はそれぞれ
    w=x[1][(1+2)%3];
    x[1][(1+2)%3]=x[1][5-(1+2)%3];
    x[1][5-(1+2)%3]=w;
 すなわち、
    w=x[1][0];
    x[1][0]=x[1][5];
    x[1][5]=w;
 ですから、

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

 の茶色部分が交換されて、

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

 となります。
i=2のとき
    w=x[i][(i+2)%3];
    x[i][(i+2)%3]=x[i][5-(i+2)%3];
    x[i][5-(i+2)%3]=w;
 はそれぞれ
    w=x[2][(2+2)%3];
    x[2][(2+2)%3]=x[2][5-(2+2)%3];
    x[2][5-(2+2)%3]=w;
 すなわち、
    w=x[2][1];
    x[2][1]=x[2][4];
    x[2][4]=w;
 ですから、

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

 の茶色部分が交換されて、

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

 となります。
これで左右の移動はすべて完了しました。


  //上下線対称移動
  for(i=0;i<3;i++){
    w=x[(i+2)%3][i];
    x[(i+2)%3][i]=x[5-(i+2)%3][i];
    x[5-(i+2)%3][i]=w;
  }
の部分のトレースは是非ご自分でなさって下さい。


では、この講最後の課題です。
4次魔方陣については、

10 11 12
13 14 15 16

の部分を中央の点に関して、点対称移動を行っても完成します。

15 14
12
10 11
13 16

今度はこの方法で4次魔方陣を作って下さい。



第8話へ 第10話へ

a


初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門

数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座

初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ