第13講 ベクタを利用して4次魔方陣を作ろう!
第10話 4次魔方陣作成プログラミングその2の解説

 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

をfor文で実現するプログラムの主要部分再掲
void g(vector<vector<int>>::iterator m){
   int w;
   for(int i=0;i<2;i++){
     w=m[3][2-i];
     m[3][2-i]=m[0][1+i];
     m[0][1+i]=w;
   }
   for(int i=0;i<2;i++){
     w=m[2-i][3];
     m[2-i][3]=m[1+i][0];
     m[1+i][0]=w;
   }
}

今回も第8話のプログラム
void g(vector<vector<int>>::iterator m){
   int w;
  
w=m[3][2];
   m[3][2]=m[0][1];
   m[0][1]=w;

  
w=m[3][1];
   m[3][1]=m[0][2];
   m[0][2]=w;


  
w=m[2][3];
   m[2][3]=m[1][0];
   m[1][0]=w;

  
w=m[1][3];
   m[1][3]=m[2][0];
   m[2][0]=w;

}
と対比させながら、トレースします。

前半部分
   for(int i=0;i<2;i++){
     w=m[3][2-i];
     m[3][2-i]=m[0][1+i];
     m[0][1+i]=w;
   }
からトレースしましょう。
i=0のとき
     w=m[3][2-i];
     m[3][2-i]=m[0][1+i];
     m[0][1+i]=w;

     w=m[3][2-0];
     m[3][2-0]=m[0][1+0];
     m[0][1+0]=w;
すなわち、
     w=m[3][2];
     m[3][2]=m[0][1];
     m[0][1]=w;
となりますから、第8話プログラムの
   w=m[3][2];
   m[3][2]=m[0][1];
   m[0][1]=w;

ピンクと同じです。
   for(int i=0;i<2;i++){
     w=m[3][2-i];
     m[3][2-i]=m[0][1+i];
     m[0][1+i]=w;
   }
i=1のとき
     w=m[3][2-i];
     m[3][2-i]=m[0][1+i];
     m[0][1+i]=w;

     w=m[3][2-1];
     m[3][2-1]=m[0][1+1];
     m[0][1+1]=w;
すなわち、
     w=m[3][1];
     m[3][1]=m[0][2];
     m[0][2]=w;
となりますから、第8話プログラムの
   w=m[3][1];
   m[3][1]=m[0][2];
   m[0][2]=w;

と同じです。


次ぎに、後半部分
   for(int i=0;i<2;i++){
     w=m[2-i][3];
     m[2-i][3]=m[1+i][0];
     m[1+i][0]=w;
   }
をトレースしましょう。
i=0のとき
     w=m[2-i][3];
     m[2-i][3]=m[1+i][0];
     m[1+i][0]=w;

     w=m[2-0][3];
     m[2-0][3]=m[1+0][0];
     m[1+0][0]=w;
すなわち、
     w=m[2][3];
     m[2][3]=m[1][0];
     m[1][0]=w;
となりますから、第8話プログラムの
   w=m[2][3];
   m[2][3]=m[1][0];
   m[1][0]=w;

薄茶と同じです。
   for(int i=0;i<2;i++){
     w=m[2-i][3];
     m[2-i][3]=m[1+i][0];
     m[1+i][0]=w;
   }
i=1のとき
     w=m[2-i][3];
     m[2-i][3]=m[1+i][0];
     m[1+i][0]=w;

     w=m[2-1][3];
     m[2-1][3]=m[1+1][0];
     m[1+1][0]=w;
すなわち、
     w=m[1][3];
     m[1][3]=m[2][0];
     m[2][0]=w;
となりますから、第8話プログラムの
   w=m[1][3];
   m[1][3]=m[2][0];
   m[2][0]=w;

と同じです。

というわけで、

 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

が実現できるのです。

さて、第14講では6次魔方陣の作成に挑戦しましょう。
これもいきなりでは難しいですから、
段階を踏んで最後に
a
を実現することにしましょう。
最初は、
x
を実現するプログラムから考えましょう。

第9話へ 第14講第1話へ


a

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

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