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