第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++入門基礎講座へ