第14講 4次及び6次魔方陣の作成
第10話 左右・上下対称移動解説
0 | 1 | 2 | 3 | 4 | 5 | |
0 | 36 | 2 | 3 | 4 | 5 | 33 |
1 | 7 | 29 | 9 | 10 | 27 | 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 |
左右対称移動及び上下対称移動対応コード
public static void i(int a[][]){
int i,w;
for(i=0;i<3;i++){
w=a[i][(i+2)%3];
a[i][(i+2)%3]=a[i][5-(i+2)%3];
a[i][5-(i+2)%3]=w;
}
}
public static void j(int a[][]){
int i,w;
for(i=0;i<3;i++){
w=a[i][(i+1)%3];
a[i][(i+1)%3]=a[5-i][(i+1)%3];
a[5-i][(i+1)%3]=w;
}
}
0 | 1 | 2 | |
0 | 36 | 2 | 3 |
1 | 7 | 29 | 9 |
2 | 13 | 14 | 22 |
線対称移動プログラムの一番肝要な点は、
左右対称移動の場合は、紺のセルをいかに実現するか、
上下対称移動なら、薄緑のセルをどのようになぞるか、
が問題です。
幸いなことに点対称移動を含めて、
3つの移動に対応する色の法則は共通のものがあります。
いずれも斜め下に下がるです。
ただし、線対称移動の場合は途中で右端にぶつかってしまいます。
そのときは、一番左端に移動すればよいのです。
紺のセルをいかに実現できるでしょうか。
y座標の動きは簡単です。
0→1→2
x座標は
2→0→1
と動きます。
この動きを実現するのが、(i+2)%3です。
a%bの式は、aをbで割ったときの余りを求めるものです。
実際に、iに0、1、2と代入してみましょう。
(i+2)%3=(0+2)%3=2%3=2
(i+2)%3=(1+2)%3=3%3=0
(i+2)%3=(2+2)%3=4%3=1
というわけで、
2→0→1
の動きを実現しています。
この動きを実現できれば、
0 | 1 | 2 | 3 | 4 | 5 | |
0 | 36 | 2 | 3 | 4 | 5 | 33 |
1 | 7 | 29 | 9 | 10 | 27 | 12 |
2 | 13 | 14 | 22 | 21 | 17 | 18 |
左右の対称移動は簡単です。
交換すべきセルの座標は、(y、x)と(y、5-x)です。
つまり、座標
(i、(i+2)%3)と(i、5-(i+2)%3)の交換です。
w=a[i][(i+2)%3];
a[i][(i+2)%3]=a[i][5-(i+2)%3];
a[i][5-(i+2)%3]=w;
この3行で該当セルの交換が行われ
0 | 1 | 2 | 3 | 4 | 5 | |
0 | 36 | 2 | 4 | 3 | 5 | 33 |
1 | 12 | 29 | 9 | 10 | 27 | 7 |
2 | 13 | 17 | 22 | 21 | 14 | 18 |
の実現に成功します。
次は薄緑セル座標の動きを見ましょう。
0 | 1 | 2 | |
0 | 36 | 2 | 3 |
1 | 7 | 29 | 9 |
2 | 13 | 14 | 22 |
y座標は
0→1→2
x座標は
1→2→0
と動きます。
1→2→0をいかに実現すべきは、簡単ですね。
(i+1)%3ですね。
交換すべきセル座標は、(y、x)と(5-y、x)です。
つまり、座標
(i、(i+2)%3)と(5-i、(i+2)%3)の交換です。
したがいまして、
w=a[i][(i+1)%3];
a[i][(i+1)%3]=a[5-i][(i+1)%3];
a[5-i][(i+1)%3]=w;
の3行で
0 | 1 | 2 | |
0 | 36 | 2 | 3 |
1 | 7 | 29 | 9 |
2 | 13 | 14 | 22 |
3 | 19 | 20 | 16 |
4 | 25 | 11 | 27 |
5 | 6 | 32 | 33 |
の該当セルが交換され、
0 | 1 | 2 | |
0 | 36 | 32 | 3 |
1 | 7 | 29 | 27 |
2 | 19 | 14 | 22 |
3 | 13 | 20 | 16 |
4 | 25 | 11 | 9 |
5 | 6 | 2 | 33 |
が実現できるのです。
以上の解説を通して、
呪文のように難しかったコードの意味が、明瞭に掴めたのではないでしょうか。
次講は、クラスの学習その2=public、private、staticの意味です。
第9話へ 第15講第1話へ
VB講義へ
VB講義基礎へ
vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 入門 C++ 入門
基礎から応用まで第1部
初心者のための VC++による C言語 入門 C++ 入門
基礎から応用まで第2部
初心者のための
VC++による C言語 入門 C++ 入門 基礎から応用まで第3部