第7講 4次および6次魔方陣の作成  
第6話 4次魔方陣作成プログラム解説
コード例再掲
void f(){
   int m[4][4],i,j;
   for(i=0;i<4;i++){
     for(j=0;j<4;j++){
       m[i][j]=4*i+j+1;
       if(m[i][j]<10)cout<<"0"<<m[i][j]<<" ";
       if(m[i][j]>=10)cout<<m[i][j]<<" ";
     }
     cout<<endl;
   }

   
cout<<endl;
   cout<<"4次魔方陣作成"<<endl;
   int w;
   for(i=0;i<2;i++){
     w=m[i][i];
     m[i][i]=m[3-i][3-i];
     m[3-i][3-i]=w;
   }

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

   for(i=0;i<4;i++){
     for(j=0;j<4;j++){
       if(m[i][j]<10)cout<<"0"<<m[i][j]<<" ";
       if(m[i][j]>=10)cout<<m[i][j]<<" ";
     }
     cout<<endl;
   }
   cout<<endl;
}

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


   for(i=0;i<4;i++){
     for(j=0;j<4;j++){
       m[i][j]=4*i+j+1;
       if(m[i][j]<10)cout<<"0"<<m[i][j]<<" ";
       if(m[i][j]>=10)cout<<m[i][j]<<" ";
     }
     cout<<endl;
   }

この紺色の部分では、自然配列

0 1 2 3
0 01 02 03 04
1
05 06 07 08
2
09 10 11 12
0
13
14 15 16

を作っています。
そして、以降2つの2次元ループで対角線上の値を交換しています。
ピンクは対角線を、は逆対角線を交換しています。
まず、2個目の2次元ループで
   for(i=0;i<2;i++){
     w=m[i][i];
     m[i][i]=m[3-i][3-i];
     m[3-i][3-i]=w;
   }

では、

0 1 2 3
0 01 02 03 04
1 05 06 07 08
2 09 10 11 12
3 13 14 15 16

のピンクの部分を交換しています。
わかりにくいと思いますので
トレースしてみましょう。
i=0のとき、
w=m[0][0]=1
m[0][0]=m[3-0][3-0]=m[3][3]=16
m[3-0][3-0]=m[3][3]=w=1
で1と16の交換に成功しました。

0 1 2 3
0 16 02 03 04
1 05 06 07 08
2 09 10 11 12
3 13 14 15 01

i=1のとき、
w=m[1][1]=6
m[1][1]=m[3-1][3-1]=m[2][2]=11
m[2-0][2-0]=m[2][2]=w=6
で6と11の交換に成功しました。

0 1 2 3
0 16 02 03 04
1 05 11 07 08
2 09 10 06 12
3 13 14 15 01

次に3個目の2次ループ
   for(i=0;i<2;i++){
     w=m[i][3-i];
     m[i][3-i]=m[3-i][i];
     m[3-i][i]=w;
   }

の動きを追います。

0 1 2 3
0 16 02 03 04
1 05 11 07 08
2 09 10 06 12
3 13 14 15 01

の部分を交換しています。
i=0のとき、
w=m[0][3-0]=m[0][3]=4
m[0][3]=m[3-0][0]=m[3][0]=13
m[3][0]=w=4
で4と13の交換に成功しました。

0 1 2 3
0 16 02 03 13
1 05 11 07 08
2 09 10 06 12
3 04 14 15 01


i=1のとき、
w=m[1][3-1]=m[1][2]=7
m[1][2]=m[3-1][1]=m[2][1]=10
m[2][1]=w=7
で7と10の交換に成功しました。

0 1 2 3
0 16 02 03 13
1 05 11 10 08
2 09 07 06 12
3 04 14 15 01

すなわち、

0 1 2 3
0 16 02 03 13
1 05 11 10 08
2 09 07 06 12
3 04 14 15 01


さあ、みなさんいよいよ6次魔方陣に挑戦ですよ。




第5話へ 第7話へ


戻る


VB講義へ
VB講義基礎へ

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