第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]がy座標(縦座標)、
m[a][b]の後半[b]がx座標(横座標)
となっていることにご注意してください。
つまり、エクセルのセルとは縦・横が
反対になっていることに注意しましょう。
以下座標と色が対応していまので、
それに留意されながらお読みください。
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次魔方陣に挑戦ですよ。
VB講義へ
VB講義基礎へ
vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)