第8講 4次魔方陣と6次魔方陣の作成
第7話 for文版解説その2
void h(int **x){
int w,i;
for(i=0;i<2;i++){
w=x[i][i];
x[i][i]=x[3-i][3-i];
x[3-i][3-i]=w;
}
for(i=0;i<2;i++){
w=x[i][3-i];
x[i][3-i]=x[3-i][i];
x[3-i][i]=w;
}
}
コピペ用添付ファイル
解説
今度は逆対角線部分
for(i=0;i<2;i++){
w=x[i][3-i];
x[i][3-i]=x[3-i][i];
x[3-i][i]=w;
}
を解説します。
i=0のとき、
w=x[i][3-i];
は
w=x[0][3];
ですから、
0 | 1 | 2 | 3 | |
0 | 16 | 2 | 3 | 4 |
1 | 5 | 11 | 7 | 8 |
2 | 9 | 10 | 6 | 12 |
3 | 13 | 14 | 15 | 1 |
座標(0,3)の4がwに収納されます。
x[i][3-i]=x[3-i][i];
は、i=0ですから、
x[0][3-0]=x[3-0][0];
すなわち、
x[0][3]=x[3][0];
となり、
0 | 1 | 2 | 3 | |
0 | 16 | 2 | 3 | 4 |
1 | 5 | 11 | 7 | 8 |
2 | 9 | 10 | 6 | 12 |
3 | 13 | 14 | 15 | 1 |
座標(3,0)の13が座標(0,3)に収納されて、
0 | 1 | 2 | 3 | |
0 | 16 | 2 | 3 | 13 |
1 | 5 | 11 | 7 | 8 |
2 | 9 | 10 | 6 | 12 |
3 | 13 | 14 | 15 | 1 |
となります。
x[3-i][i]=w;
は、i=0ですから、
x[3-0][0]=w;
すなわち、
x[3][0]=w;
となり、
座標(3,0)に(wに収納されていた4)が入ります。
0 | 1 | 2 | 3 | |
0 | 16 | 2 | 3 | 13 |
1 | 5 | 11 | 7 | 8 |
2 | 9 | 10 | 6 | 12 |
3 | 4 | 14 | 15 | 1 |
for(i=0;i<2;i++){
w=x[i][3-i];
x[i][3-i]=x[3-i][i];
x[3-i][i]=w;
}
i=1のとき、
w=x[i][3-i];
は
w=x[1][2];
となり、
0 | 1 | 2 | 3 | |
0 | 16 | 2 | 3 | 13 |
1 | 5 | 11 | 7 | 8 |
2 | 9 | 10 | 6 | 12 |
3 | 4 | 14 | 15 | 1 |
座標(1,2)の7がwに収納されます。
x[i][3-i]=x[3-i][i];
は、i=1ですから、
x[1][3-1]=x[3-1][1];
すなわち、
x[1][2]=x[2][1];
となり、
0 | 1 | 2 | 3 | |
0 | 16 | 2 | 3 | 13 |
1 | 5 | 11 | 7 | 8 |
2 | 9 | 10 | 6 | 12 |
3 | 4 | 14 | 15 | 1 |
座標(2,1)の10が座標(1,2)に収納されて、
0 | 1 | 2 | 3 | |
0 | 16 | 2 | 3 | 13 |
1 | 5 | 11 | 10 | 8 |
2 | 9 | 10 | 6 | 12 |
3 | 4 | 14 | 15 | 1 |
となります。
x[3-i][i]=w;
は、i=1ですから、
x[3-1][1]=w;
すなわち、
x[2][1]=w;
となり、
座標(2,1)にwに収納されていた7が入ります。
0 | 1 | 2 | 3 | |
0 | 16 | 2 | 3 | 13 |
1 | 5 | 11 | 10 | 8 |
2 | 9 | 7 | 6 | 12 |
3 | 4 | 14 | 15 | 1 |
これで逆対角線部分の交換が成立して全行程が終了して、
4次魔方陣が完成します。
さて、次は6次魔方陣に挑戦です。
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 |
ピンクは中心に対して点対称移動、
薄緑は中央の直線に対して上下に線対称移動、
紺色は中央の直線に対して左右に線対称移動
でした。
大変ですが、すべての交換をfor文で実現しましょう。
ヒントを入れておきます。
薄緑や紺色の複雑な動きを実現するキーは、
(i+2)%3です。
a%bはaをbで割ったときの余りを求める計算です。
例えば、
5%3=2
です。
5を3で割った余りは、2ですよね。
初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ