第7講 4次および6次魔方陣の作成  
第9話 6次魔方陣作成プログラム解説その2
コード主要部分再掲
void f(){
      ・
   int w;
   for(i=0;i<3;i++){
     w=m[i][i];
     m[i][i]=m[5-i][5-i];
     m[5-i][5-i]=w;
   }

   for(i=0;i<3;i++){
     w=m[i][5-i];
     m[i][5-i]=m[5-i][i];
     m[5-i][i]=w;
   }

   for(i=0;i<3;i++){
     w=m[(i+2)%3][i];
     m[(i+2)%3][i]=m[5-(i+2)%3][i];
     m[5-(i+2)%3][i]=w;
   }

   for(i=0;i<3;i++){
     w=m[i][(i+2)%3];
     m[i][(i+2)%3]=m[i][5-(i+2)%3];
     m[i][5-(i+2)%3]=w;
   }

      ・
}

解説
以降トレースをしていきますが、
m[
a][b]の前半[a]が座標(座標)、
m[
a][b]の後半[b]が座標(座標)
となっていることにご注意してください。
つまり、エクセルのセルとは縦・横が
反対になっていることに注意しましょう。
以下座標と色が対応していまので、
それに留意されながらお読みください。

  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


3番目に赤のコード
   for(i=0;i<3;i++){
     w=m[(i+2)%3][i];
     m[(i+2)%3][i]=m[5-(i+2)%3][i];
     m[5-(i+2)%3][i]=w;
   }

をトレースしてみましょう。

i=0とのき、
w=m[(0+2)%3][0]=m[2][0]=13
m[2][0]=m[5-(0+2)%3][0]=m[3][0]=19
m[3][0]=13
これで13と19の交換に成功しました。

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

i=1とのき、
w=m[(1+2)%3][1]=m[0][1]=2
m[0][1]=m[5-(1+2)%3][1]=m[5][1]=32
m[5][1]=2
これで2と32の交換に成功しました。

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

i=2とのき、
w=m[(2+2)%3][2]=m[1][2]=9
m[1][2]=m[5-(2+2)%3][2]=m[4][2]=27
m[4][2]=9
これで9と27の交換に成功しました。

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


最後に濃紺のコード
   for(i=0;i<3;i++){
     w=m[i][(i+2)%3];
     m[i][(i+2)%3]=m[i][5-(i+2)%3];
     m[i][5-(i+2)%3]=w;
   }
をトレースしましょう。
i=0とのき、
w=m[0][(0+2)%3]=m[0][2]=3
m[0][2]=m[0][5-(0+2)%3]=m[0][3]=4
m[0][3]=3
これで3と4の交換に成功しました。

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

i=1とのき、
w=m[1][(1+2)%3]=m[1][0]=7
m[1][0]=m[1][5-(1+2)%3]=m[1][5]=12
m[1][5]=7
これで7と12の交換に成功しました。

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

i=2とのき、
w=m[2][(2+2)%3]=m[2][1]=14
m[2][1]=m[2][5-(2+2)%3]=m[2][4]=17
m[1][5]=14
これで14と17の交換に成功しました。

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

以上より

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

が完成しています。


さて、次の課題です。4次魔方陣は、

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

ピンクの部分を中心に対して点対称移動しても作成できます。
今度はこの方法で、4次魔方陣を作成してみましょう。




第8話へ 第10話へ


戻る


VB講義へ
VB講義基礎へ

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