第9講 4次魔方陣と6次魔方陣の作成
第7話 6次魔方陣の解答例と解説

解答例
#pragma once
char a[6][6];
     ・
     ・
     ・
#pragma endregion
  private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
          char i;
          char j;
          String^ w=L"";

          for(i=0;i<6;i++){
            for(j=0;j<6;j++){
              a[i][j]=6*i+j+1;
            }
          }
          for(i=0;i<6;i++){
            for(j=0;j<6;j++){
              if(a[i][j]<10)w=w+L"0"+(a[i][j]).ToString()+L" ";
              if(a[i][j]>=10)w=w+(a[i][j]).ToString()+L" ";
            }
            w=w+L"\n";
          }
          label1->Text=w;

          char v;

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


            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++){
              if(((i+2) % 3)==j){
                v=a[i][j];
                a[i][j]=a[i][5-j];
                a[i][5-j]=v;
              }
            }
          }

          w=L"";
          for(i=0;i<6;i++){
            for(j=0;j<6;j++){
              if(a[i][j]<10)w=w+L"0"+(a[i][j]).ToString()+L" ";
              if(a[i][j]>=10)w=w+(a[i][j]).ToString()+L" ";
            }
            w=w+L"\n";
          }
          label2->Text=w;


        }
  };
}

(コピーペースト用

char i;
char j;
String^ w=L"";

for(i=0;i<6;i++){
for(j=0;j<6;j++){
a[i][j]=6*i+j+1;
}
}
for(i=0;i<6;i++){
for(j=0;j<6;j++){
if(a[i][j]<10)w=w+L"0"+(a[i][j]).ToString()+L" ";
if(a[i][j]>=10)w=w+(a[i][j]).ToString()+L" ";
}
w=w+L"\n";
}
label1->Text=w;

char v;
for(i=0;i<3;i++){
for(j=0;j<6;j++){
if((i==j) || (i==5-j)){
v=a[i][j];
a[i][j]=a[5-i][5-j];
a[5-i][5-j]=v;
}
}
}
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++){
if(((i+1) % 3)==j){
v=a[i][j];
a[i][j]=a[5-i][j];
a[5-i][j]=v;
}
}
}


w=L"";
for(i=0;i<6;i++){
for(j=0;j<6;j++){
if(a[i][j]<10)w=w+L"0"+(a[i][j]).ToString()+L" ";
if(a[i][j]>=10)w=w+(a[i][j]).ToString()+L" ";
}
w=w+L"\n";
}
label2->Text=w;


解説
for(i=0;i<3;i++){
  for(j=0;j<6;j++){
    if((i==j) || (i==5-j)){
      v=a[i][j];
      a[i][j]=a[5-i][5-j];
      a[5-i][5-j]=v;
    }
  }
}

では、対角線の点対称移動を行っています。
すなわち、

 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

ピンクの部分の点対称移動です。このプログラムの実行の結果、

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

となります。
(i==j) || (i==5-j)の意味は(iがjに等しい)または(jがiに等しい)でした。|は『または』を意味していましたね。

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;
    }
  }
}

では

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;
    }
  }
}

では、

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次魔方陣が完成します。

具体的にトレースしてみましょう。
まず、
for(i=0;i<3;i++){
  for(j=0;j<6;j++){
    if((i==j) || (i==5-j)){
      v=a[i][j];
      a[i][j]=a[5-i][5-j];
      a[5-i][5-j]=v;
    }
  }
}

から。
T i=0の場合
 @ j=0のとき
   i=0、j=0からi=jを満たし条件(i==j) || (i==5-j)をクリアしif文が実行されます。
   v=a[0][0];
   a[0][0]=a[5][5];
   a[5][5]=v;
   によって、

36  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  1

となります。
 A j=1のとき、
   i=0、j=1なのでi=jとi=5-jのいずれの条件もクリアせず、if文は実行されません。
 B j=2のとき、
   i=0、j=2なのでi=jとi=5-jのいずれの条件もクリアせず、if文は実行されません。
 C j=3のとき、
   i=0、j=3なのでi=jとi=5-jのいずれの条件もクリアせず、if文は実行されません。
D j=4のとき、
   i=0、j=4なのでi=jとi=5-jのいずれの条件もクリアせず、if文は実行されません。
E j=5
   i=0、j=5なのでi=5-jを満たし、条件(i==j) || (i==5-j)をクリアしif文が実行されます。
   v=a[i][j];
   a[i][j]=a[5-i][5-j];
   a[5-i][5-j]=v;

   なので
   v=a[0][5];
   a[0][5]=a[5][0];
   a[5][0]=v;
   となり、

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

U i=1の場合
 @ j=0のとき
   i=1、j=0なのでi=jとi=5-jのいずれの条件もクリアせず、if文は実行されません。
 A j=1のとき、
   i=1、j=1なのでi=jを満たし条件(i==j) || (i==5-j)をクリアしif文が実行されます。
   v=a[i][j];
   a[i][j]=a[5-i][5-j];
   a[5-i][5-j]=v;

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

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

   となります。
 B j=2のとき、
   i=1、j=2なのでi=jとi=5-jのいずれの条件もクリアせず、if文は実行されません。
 C j=3のとき、
   i=1、j=3なのでi=jとi=5-jのいずれの条件もクリアせず、if文は実行されません。
 D j=4のとき、
   i=1、j=4なのでi=5-jを満たし条件(i==j) || (i==5-j)をクリアしif文が実行されます。
   v=a[i][j];
   a[i][j]=a[5-i][5-j];
   a[5-i][5-j]=v;

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

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

   となります。
 E j=5のとき
   i=1、j=5なのでi=jとi=5-jのいずれの条件もクリアせず、if文は実行されません。

V i=2の場合
 @ j=0のとき
   i=2、j=0なのでi=jとi=5-jのいずれの条件もクリアせず、if文は実行されません。
 A j=1のとき、
   i=2、j=1なのでi=jとi=5-jのいずれの条件もクリアせず、if文は実行されません。
 B j=2のとき、
   i=2、j=2なのでi=jを満たし条件(i==j) || (i==5-j)をクリアしif文が実行されます。
   v=a[i][j];
   a[i][j]=a[5-i][5-j];
   a[5-i][5-j]=v;

   なので
   v=a[2][2];
   a[2][2]=a[3][3];
   a[3][3]=v;
   となり、

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

   となります。
 C j=3のとき、
   i=2、j=3なのでi=5-jを満たし条件(i==j) || (i==5-j)をクリアしif文が実行されます。
   v=a[i][j];
   a[i][j]=a[5-i][5-j];
   a[5-i][5-j]=v;

   なので
   v=a[2][3];
   a[2][3]=a[3][2];
   a[3][2]=v;
   となり、

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

   となります。
 D j=4のとき、
   i=1、j=4なのでi=jとi=5-jのいずれの条件もクリアせず、if文は実行されません。
 E j=5のとき
   i=1、j=5なのでi=jとi=5-jのいずれの条件もクリアせず、if文は実行されません。

対角線の交換が終了しています。
第7話がだいぶ長くなりましたので、この辺でこの話を終了としたいと思います。
解説の続きは第8話で。


第6話へ 第8話へ



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