第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  4
1  5  6  7  8
2  9 10 11 12
3 13 14 15 16

      

 
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話へ


a

eclipse c++ 入門講義第1部へ

魔方陣 数独で学ぶ V
BA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ