第8講 4次魔方陣と6次魔方陣の作成
第9話 6次魔方陣生成アプリ交換プログラムコードの解説
//左右線対称移動
for(i=0;i<3;i++){
w=x[i][(i+2)%3];
x[i][(i+2)%3]=x[i][5-(i+2)%3];
x[i][5-(i+2)%3]=w;
}
について解説します。
まず、(i+2)%3についてトレースしましょう。
i=0のとき
(i+2)%3=(0+2)%3=2%3=2
i=1のとき
(i+2)%3=(1+2)%3=3%3=0
i=2のとき
(i+2)%3=(2+2)%3=4%3=1
次に
//左右線対称移動
for(i=0;i<3;i++){
w=x[i][(i+2)%3];
x[i][(i+2)%3]=x[i][5-(i+2)%3];
x[i][5-(i+2)%3]=w;
}
をトレースしてみましょう。
くどいようですが、第6話の注意をもう一度書いておきます。
プログラミングでは行(横列)→列(縦列)の順で考えますから、
座標(2,1)は、2が行番号(縦軸)に対応し、
1が列番号(横軸)に対応しています。
数学の座標は(横軸、縦軸)であるのとは反対で(縦軸、横軸)となっています。
ですから、 座標(2,1)は
0 | 1 | 2 | 3 | |
0 | 1 | 2 | 3 | 4 |
1 | 5 | 6 | 7 | 8 |
2 | 9 | 10 | 11 | 12 |
3 | 13 | 14 | 15 | 16 |
茶色のセル(ます)をあらわします。
すなわち、10が入っているセル(ます)です。
i=0のとき
w=x[i][(i+2)%3];
x[i][(i+2)%3]=x[i][5-(i+2)%3];
x[i][5-(i+2)%3]=w;
はそれぞれ
w=x[0][(0+2)%3];
x[0][(0+2)%3]=x[0][5-(0+2)%3];
x[0][5-(0+2)%3]=w;
すなわち、
w=x[0][2];
x[0][2]=x[0][3];
x[0][3]=w;
ですから、
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 |
の茶色の部分が交換されて、
0 | 1 | 2 | 3 | 4 | 5 | |
0 | 36 | 2 | 4 | 3 | 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 |
となります。
i=1のとき
w=x[i][(i+2)%3];
x[i][(i+2)%3]=x[i][5-(i+2)%3];
x[i][5-(i+2)%3]=w;
はそれぞれ
w=x[1][(1+2)%3];
x[1][(1+2)%3]=x[1][5-(1+2)%3];
x[1][5-(1+2)%3]=w;
すなわち、
w=x[1][0];
x[1][0]=x[1][5];
x[1][5]=w;
ですから、
0 | 1 | 2 | 3 | 4 | 5 | |
0 | 36 | 2 | 4 | 3 | 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 |
の茶色の部分が交換されて、
0 | 1 | 2 | 3 | 4 | 5 | |
0 | 36 | 2 | 4 | 3 | 5 | 31 |
1 | 12 | 29 | 9 | 10 | 26 | 7 |
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 |
となります。
i=2のとき
w=x[i][(i+2)%3];
x[i][(i+2)%3]=x[i][5-(i+2)%3];
x[i][5-(i+2)%3]=w;
はそれぞれ
w=x[2][(2+2)%3];
x[2][(2+2)%3]=x[2][5-(2+2)%3];
x[2][5-(2+2)%3]=w;
すなわち、
w=x[2][1];
x[2][1]=x[2][4];
x[2][4]=w;
ですから、
0 | 1 | 2 | 3 | 4 | 5 | |
0 | 36 | 2 | 4 | 3 | 5 | 31 |
1 | 12 | 29 | 9 | 10 | 26 | 7 |
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 |
の茶色の部分が交換されて、
0 | 1 | 2 | 3 | 4 | 5 | |
0 | 36 | 2 | 4 | 3 | 5 | 31 |
1 | 12 | 29 | 9 | 10 | 26 | 7 |
2 | 13 | 17 | 22 | 21 | 14 | 18 |
3 | 19 | 20 | 16 | 15 | 23 | 24 |
4 | 25 | 11 | 27 | 28 | 8 | 30 |
5 | 6 | 32 | 33 | 34 | 35 | 1 |
となります。
これで左右の移動はすべて完了しました。
//上下線対称移動
for(i=0;i<3;i++){
w=x[(i+2)%3][i];
x[(i+2)%3][i]=x[5-(i+2)%3][i];
x[5-(i+2)%3][i]=w;
}
の部分のトレースは是非ご自分でなさって下さい。
では、この講最後の課題です。
4次魔方陣については、
1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 |
の部分を中央の点に関して、点対称移動を行っても完成します。
1 | 15 | 14 | 4 |
12 | 6 | 7 | 9 |
8 | 10 | 11 | 5 |
13 | 3 | 2 | 16 |
今度はこの方法で4次魔方陣を作って下さい。
第8話へ 第10話へ
初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ