第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話の注意をもう一度書いておきます。

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

  0 1  2  3 
0 1 2 3 4
1 5 6 7 8
2 9 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 1  2  3  4  5 
0 36 2 3 4 5 31
1 7 29 9 10 26 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

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

  0 1  2  3  4  5 
0 36 2 4 3 5 31
1 7 29 9 10 26 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

 となります。

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 1  2  3  4  5 
0 36 2 4 3 5 31
1 7 29 9 10 26 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

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

  0 1  2  3  4  5 
0 36 2 4 3 5 31
1 12 29 9 10 26 7
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

 となります。
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 1  2  3  4  5 
0 36 2 4 3 5 31
1 12 29 9 10 26 7
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

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

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

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


  //上下線対称移動
  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次魔方陣については、

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

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

1 15 14 4
12 6 7 9
8 10 11 5
13 3 2 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 入門 サイト 基礎から応用まで
本サイトトップへ