第9講 4次魔方陣と6次魔方陣の作成
第8話 6次魔方陣の解説の続き

for(i=0;i<3;i++){
  for(j=0;j<3;j++){
    if(((i+1) % 3)==j){
      v=a[i][j];
      a[i][j]=a[5-i][j];
      a[5-i][j]=v;
    }
  }
}

について、解説していきましょう。
まず、
for(i=0;i<3;i++){
  for(j=0;j<3;j++){

から、i、jの動く範囲は、

に限定されます。
さらに、if(((i+1) % 3)==j)の条件から動く範囲が絞られます。
(i+1) % 3はi+1を3で割った余りを意味します。
よって、((i+1) % 3)==jを満たすのは、
i=0、j=1   i=1、j=3   i=2、j=0  
の3つの場合で、交換対象セルは、

ということになります。


ではいつものように具体的にトレースしてみましょう。

T i=0の場合
 @ j=0のとき、
   i=0から((i+1) % 3)=(1 % 3)=1≠jなので、条件((i+1) % 3)==jに抵触して、if文は実行されません。
 A j=1のよき、
   i=0から((i+1) % 3)=(1 % 3)=1=jなので、条件((i+1) % 3)==jをクリアして、if文が実行されます。
   v=a[i][j];
   a[i][j]=a[5-i][j];
   a[5-i][j]=v;

   なので、
   v=a[0][1];
   a[0][1]=a[5][1];
   a[5][1]=v;
 
   により、
が交換されます。
 B j=1のとき、  
   i=0から((i+1) % 3)=(1 % 3)=1≠jなので、条件((i+1) % 3)==jに抵触して、if文は実行されません。

U i=1の場合
 @ j=0のとき、
   i=1から((i+1) % 3)=(2 % 3)=2≠jなので、条件((i+1) % 3)==jに抵触して、if文は実行されません。
 A j=1のとき、
   i=1から((i+1) % 3)=(2 % 3)=2≠jなので、条件((i+1) % 3)==jに抵触して、if文は実行されません。
 B j=2
   i=1から((i+1) % 3)=(2 % 3)=2=jなので、条件((i+1) % 3)==jをクリアして、if文が実行されます。
   v=a[i][j];
   a[i][j]=a[5-i][j];
   a[5-i][j]=v;

   なので、
   v=a[1][2];
   a[1][2]=a[4][2];
   a[4][2]=v; 

   により、
が交換されます。
V i=2の場合
 @ j=0のとき、
   i=1から((i+2) % 3)=(3 % 3)=0=jなので、条件((i+1) % 3)==jをクリアして、if文が実行されます。
   v=a[i][j];
   a[i][j]=a[5-i][j];
   a[5-i][j]=v;

   なので、
   v=a[2][0];
   a[2][0]=a[3][0];
   a[3][0]=v;
 
   により、
が交換される。

 A j=1のとき、
   i=2から((i+1) % 3)=(3 % 3)=0≠jなので、条件((i+1) % 3)==jに抵触して、if文は実行されません。
 B j=2のとき、
   i=2から((i+1) % 3)=(3 % 3)=3≠jなので、条件((i+1) % 3)==jに抵触して、if文は実行されません。

以上より

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

       

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

が実現します。


最後に
for(i=0;i<3;i++){
  for(j=0;j<3;j++){
    if(((i+2) % 3)==j){
      v=a[i][j];
      a[i][j]=a[i][5-j];
      a[i][5-j]=v;
    }
  }
}

の解説です。
まず、
for(i=0;i<3;i++){
  for(j=0;j<3;j++){

によって、i、jの動く範囲は、

に限定されるのは、前と同じです。
if文の条件は、今回は((i+2) % 3)==jなので、これを満たす組み合わせは
i=0、j=2   i=1、j=0   i=2、j=1 ですので 
対称移動対象セルは
です。

ではトレースしてみましょう。
T i=0の場合
 @ j=0のとき、
   i=0から((i+2) % 3)=(2 % 3)=2≠jなので、条件((i+2) % 3)==jに抵触して、if文は実行されません。
 A j=1のとき、
   i=0から((i+2) % 3)=(2 % 3)=2≠jなので、条件((i+2) % 3)==jに抵触して、if文は実行されません。
 B j=2
   i=0から((i+2) % 3)=(2 % 3)=2=jなので、条件((i+2) % 3)==jをクリアして、if文が実行されます。
   v=a[i][j];
   a[i][j]=a[i][5-j];
   a[i][5-j]=v;

   ですので、
   v=a[0][2];
   a[0][2]=a[0][3];
   a[0][3]=v;
 となり、
が交換されます。

U i=1の場合
 @ j=0のとき、
   i=1から((i+2) % 3)=(3 % 3)=0=jなので、条件((i+2) % 3)==jをクリアして、if文が実行されます。
   v=a[i][j];
   a[i][j]=a[i][5-j];
   a[i][5-j]=v;

   ですので、
   v=a[1][0];
   a[1][0]=a[1][5];
   a[1][5]=v;
 となり、
が交換されます。
 A j=1のとき、
   i=1から((i+2) % 3)=(3 % 3)=0≠jなので、条件((i+2) % 3)==jに抵触して、if文は実行されません。
 B j=2のとき、
   i=1から((i+2) % 3)=(3 % 3)=0≠jなので、条件((i+2) % 3)==jに抵触して、if文は実行されません。
T i=2の場合
 @ j=0のとき、
   i=2から((i+2) % 3)=(4 % 3)=1≠jなので、条件((i+2) % 3)==jに抵触して、if文は実行されません。
 A j=1のとき、
   i=2から((i+2) % 3)=(4 % 3)=1なので、条件((i+2) % 3)==jをクリアして、if文が実行されます。
   v=a[i][j];
   a[i][j]=a[i][5-j];
   a[i][5-j]=v;

   ですので、
   v=a[2][1];
   a[2][1]=a[2][4];
   a[2][4]=v;
 となり、
が交換されます。
 B j=2のとき、
   i=2から((i+2) % 3)=(4 % 3)=1≠jなので、条件((i+2) % 3)==jに抵触して、if文は実行されません。


以上より

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

          

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

が実現され、6次魔方陣が完成することがわかります。

第7話へ 第10講第1話へ



初心者のためのjava 入門 基礎から応用まで
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第1部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第2部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第3部
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすい vb 入門 vba 入門 基礎から応用まで 第1部
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ