第13講 ベクタを利用して4次魔方陣を作ろう!
第7話 for文版データ交換関数gのトレース
void g(vector<vector<int>>::iterator m){
int w;
for(int i=0;i<2;i++){
w=m[3-i][3-i];
m[3-i][3-i]=m[i][i];
m[i][i]=w;
}
for(int i=0;i<2;i++){
w=m[3-i][i];
m[3-i][i]=m[i][3-i];
m[i][3-i]=w;
}
}
これから、トレースをしていきます。
前々話の
void g(vector<vector<int>>::iterator m){
int w;
w=m[3][3];
m[3][3]=m[0][0];
m[0][0]=w;
w=m[2][2];
m[2][2]=m[1][1];
m[1][1]=w;
w=m[3][0];
m[3][0]=m[0][3];
m[0][3]=w;
w=m[2][1];
m[2][1]=m[1][2];
m[1][2]=w;
}
の該当箇所と比較しながら進めます。
まず、
for(int i=0;i<2;i++){
w=m[3-i][3-i];
m[3-i][3-i]=m[i][i];
m[i][i]=w;
}
から。
i=0のとき、
w=m[3-0][3-0];
m[3-0][3-0]=m[0][0];
m[0][0]=w;
すなわち、
w=m[3][3];
m[3][3]=m[0][0];
m[0][0]=w;
これは前々話の
w=m[3][3];
m[3][3]=m[0][0];
m[0][0]=w;
のピンクの部分と全く同じです。
for(int i=0;i<2;i++){
w=m[3-i][3-i];
m[3-i][3-i]=m[i][i];
m[i][i]=w;
}
i=1のとき、
w=m[3-1][3-1];
m[3-1][3-1]=m[1][1];
m[1][1]=w;
すなわち、
w=m[2][2];
m[2][2]=m[1][1];
m[1][1]=w;
前々話の
w=m[2][2];
m[2][2]=m[1][1];
m[1][1]=w;
の青の部分と全く同じです。
次ぎに、
for(int i=0;i<2;i++){
w=m[3-i][i];
m[3-i][i]=m[i][3-i];
m[i][3-i]=w;
}
をトレースします。
i=0のとき、
w=m[3-0][0];
m[3-0][0]=m[0][3-0];
m[0][3-0]=w;
すなわち、
w=m[3][0];
m[3][0]=m[0][3];
m[0][3]=w;
これは前々話の
w=m[3][0];
m[3][0]=m[0][3];
m[0][3]=w;
の薄茶の部分と全く同じです。
for(int i=0;i<2;i++){
w=m[3-i][i];
m[3-i][i]=m[i][3-i];
m[i][3-i]=w;
}
i=1のとき、
w=m[3-1][1];
m[3-1][1]=m[1][3-1];
m[1][3-1]=w;
すなわち、
w=m[2][1];
m[2][1]=m[1][2];
m[1][2]=w;
前々話の
w=m[2][1];
m[2][1]=m[1][2];
m[1][2]=w;
の緑の部分と全く同じです。
難解なプログラムですが、
トレースしてみるとすっきりしませんか。
皆さんに覚えて頂きたいテクニックは、
w=m[3-i][3-i];
w=m[3-i][i];
などです。
1行目は、対角線を逆から遡りますし、
2行目は、逆対角線を左下から右上に登ります。
とくに、2行目
w=m[3-i][i];
が逆対角線上を動くことに注目して下さい。
さて、6次魔方陣の作成に入る前に、
4次魔方陣のもうひとつの作り方に挑戦しておきましょう。
0 | 1 | 2 | 3 | |
0 | 1 | 2 | 3 | 4 |
1 | 5 | 6 | 7 | 8 |
2 | 9 | 10 | 11 | 12 |
3 | 13 | 14 | 15 | 16 |
↓
0 | 1 | 2 | 3 | |
0 | 1 | 15 | 14 | 4 |
1 | 12 | 6 | 7 | 9 |
2 | 8 | 10 | 11 | 5 |
3 | 13 | 3 | 2 | 16 |
(一番外側の0,1,2,3は座標を表しています。)
赤のセルを中心に対して点対称移動しても
4次魔方陣になります。
皆さん、プログラミングに挑戦しましょう。
今回も、段階を追ってプログラムしていくことにしましょう。
関数gをfor文を使わず実現してみましょう。
第6話へ 第8話へ
eclipse c++ 入門講義第1部へ
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ