第7講 4次および6次魔方陣の作成
第9話 6次魔方陣作成プログラム解説その2
コード主要部分再掲
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]がy座標(縦座標)、
m[a][b]の後半[b]がx座標(横座標)
となっていることにご注意してください。
つまり、エクセルのセルとは縦・横が
反対になっていることに注意しましょう。
以下座標と色が対応していまので、
それに留意されながらお読みください。
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 |
3番目に赤のコード
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;
}
をトレースしてみましょう。
i=0とのき、
w=m[(0+2)%3][0]=m[2][0]=13
m[2][0]=m[5-(0+2)%3][0]=m[3][0]=19
m[3][0]=13
これで13と19の交換に成功しました。
0 | 1 | 2 | 3 | 4 | 5 | |
0 | 36 | 2 | 3 | 4 | 5 | 31 |
1 | 7 | 29 | 9 | 10 | 26 | 12 |
2 | 19 | 14 | 22 | 21 | 17 | 18 |
3 | 13 | 20 | 16 | 15 | 23 | 24 |
4 | 25 | 11 | 27 | 28 | 8 | 30 |
5 | 6 | 32 | 33 | 34 | 35 | 1 |
i=1とのき、
w=m[(1+2)%3][1]=m[0][1]=2
m[0][1]=m[5-(1+2)%3][1]=m[5][1]=32
m[5][1]=2
これで2と32の交換に成功しました。
0 | 1 | 2 | 3 | 4 | 5 | |
0 | 36 | 32 | 3 | 4 | 5 | 31 |
1 | 7 | 29 | 9 | 10 | 26 | 12 |
2 | 19 | 14 | 22 | 21 | 17 | 18 |
3 | 13 | 20 | 16 | 15 | 23 | 24 |
4 | 25 | 11 | 27 | 28 | 8 | 30 |
5 | 6 | 2 | 33 | 34 | 35 | 1 |
i=2とのき、
w=m[(2+2)%3][2]=m[1][2]=9
m[1][2]=m[5-(2+2)%3][2]=m[4][2]=27
m[4][2]=9
これで9と27の交換に成功しました。
0 | 1 | 2 | 3 | 4 | 5 | |
0 | 36 | 32 | 3 | 4 | 5 | 31 |
1 | 7 | 29 | 27 | 10 | 26 | 12 |
2 | 19 | 14 | 22 | 21 | 17 | 18 |
3 | 13 | 20 | 16 | 15 | 23 | 24 |
4 | 25 | 11 | 9 | 28 | 8 | 30 |
5 | 6 | 2 | 33 | 34 | 35 | 1 |
最後に濃紺のコード
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;
}
をトレースしましょう。
i=0とのき、
w=m[0][(0+2)%3]=m[0][2]=3
m[0][2]=m[0][5-(0+2)%3]=m[0][3]=4
m[0][3]=3
これで3と4の交換に成功しました。
0 | 1 | 2 | 3 | 4 | 5 | |
0 | 36 | 32 | 4 | 3 | 5 | 31 |
1 | 7 | 29 | 27 | 10 | 26 | 12 |
2 | 19 | 14 | 22 | 21 | 17 | 18 |
3 | 13 | 20 | 16 | 15 | 23 | 24 |
4 | 25 | 11 | 9 | 28 | 8 | 30 |
5 | 6 | 2 | 33 | 34 | 35 | 1 |
i=1とのき、
w=m[1][(1+2)%3]=m[1][0]=7
m[1][0]=m[1][5-(1+2)%3]=m[1][5]=12
m[1][5]=7
これで7と12の交換に成功しました。
0 | 1 | 2 | 3 | 4 | 5 | |
0 | 36 | 32 | 4 | 3 | 5 | 31 |
1 | 12 | 29 | 27 | 10 | 26 | 7 |
2 | 19 | 14 | 22 | 21 | 17 | 18 |
3 | 13 | 20 | 16 | 15 | 23 | 24 |
4 | 25 | 11 | 9 | 28 | 8 | 30 |
5 | 6 | 2 | 33 | 34 | 35 | 1 |
i=2とのき、
w=m[2][(2+2)%3]=m[2][1]=14
m[2][1]=m[2][5-(2+2)%3]=m[2][4]=17
m[1][5]=14
これで14と17の交換に成功しました。
0 | 1 | 2 | 3 | 4 | 5 | |
0 | 36 | 32 | 4 | 3 | 5 | 31 |
1 | 12 | 29 | 27 | 10 | 26 | 7 |
2 | 19 | 14 | 22 | 21 | 17 | 18 |
3 | 13 | 20 | 16 | 15 | 23 | 24 |
4 | 25 | 11 | 9 | 28 | 8 | 30 |
5 | 6 | 2 | 33 | 34 | 35 | 1 |
以上より
0 | 1 | 2 | 3 | 4 | 5 | |
0 | 36 | 32 | 4 | 3 | 5 | 31 |
1 | 12 | 29 | 27 | 10 | 26 | 7 |
2 | 19 | 14 | 22 | 21 | 17 | 18 |
3 | 13 | 20 | 16 | 15 | 23 | 24 |
4 | 25 | 11 | 9 | 28 | 8 | 30 |
5 | 6 | 2 | 33 | 34 | 35 | 1 |
が完成しています。
さて、次の課題です。4次魔方陣は、
1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 |
ピンクの部分を中心に対して点対称移動しても作成できます。
今度はこの方法で、4次魔方陣を作成してみましょう。
VB講義へ
VB講義基礎へ
vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)