第7講 4次および6次魔方陣の作成  
第8話 6次魔方陣作成プログラム解説その1
コード主要部分再掲
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]が座標(座標)
となっていることにご注意してください。
つまり、エクセルのセルとは縦・横が
反対になっていることに注意しましょう。
以下座標と色が対応していまので、
それに留意されながらお読みください。

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

ピンクのコードで対角線を、紺のコードで逆対角線を、
赤のコード赤のセルの上下を、濃紺のコード濃紺のセルの左右
を交換しています。

今話は、ピンクのコード紺のコードを解説し、
次話では、赤のコード濃紺のコードを解説します。

まず、ピンクのコード
   for(i=0;i<3;i++){
     w=m[i][i];
     m[i][i]=m[5-i][5-i];
     m[5-i][5-i]=w;
   }

の動きをトレースしてみましょう。
i=0とのき、
w=m[0][0]=1
m[0][0]=m[5-0][5-0]=m[5][5]=36
m[5][5]=1
これで1と36の交換に成功しました。

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

i=1とのき、
w=m[1][1]=8
m[1][1]=m[5-1][5-1]=m[4][4]=29
m[4][4]=8
これで8と29の交換に成功しました。

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

i=2とのき、
w=m[2][2]=15
m[2][2]=m[5-2][5-2]=m[3][3]=22
m[3][3]=15
これで15と22の交換に成功しました。

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

次に、紺のコード
   for(i=0;i<3;i++){
     w=m[i][5-i];
     m[i][5-i]=m[5-i][i];
     m[5-i][i]=w;
   }

の動きを追います。

i=0とのき、
w=m[0][5-0]=m[0][5]=6
m[0][5]=m[5-0][0]=m[5][0]=31
m[5][0]=6
これで6と31の交換に成功しました。

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

i=1とのき、
w=m[1][5-1]=m[1][4]=11
m[1][4]=m[5-1][1]=m[4][1]=26
m[4][1]=11
これで11と26の交換に成功しました。

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

i=2とのき、
w=m[2][5-2]=m[2][3]=16
m[2][3]=m[5-2][2]=m[3][2]=21
m[3][2]=16
これで16と21の交換に成功しました。

  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



第7話へ 第9話へ


戻る


VB講義へ
VB講義基礎へ

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