第14講 ベクタを利用して6次魔方陣を作ろう!
第4話 逆対角線交換のトレース

後半
   for(int i=0;i<3;i++){ //逆対角線交換
     w=m[
5-i][i];
     m[5-i][i]=m[i][5-i];
     m[i][5-i]=w;
   }
のトレース
i=0のとき、
     w=m[5-i][i];
     m[5-i][i]=m[i][5-i];
     m[i][5-i]=w;

     w=m[5-0][0];
     m[5-0][0]=m[0][5-0];
     m[0][5-0]=w;
すなわち、
     w=m[5][0];
     m[5][0]=m[0][5];
     m[0][5]=w;
です。
1行目
     w=m[5][0];
の右辺は座標()に対応していますから、

   0  1 2 3 4 5
 0 36 2 3  4 5 6
 1 7 29 9 10 11 12
 2 13 14 22 16 17 18
 3 19 20 21 15 23 24
 4 25 26 27 28 8 30
 5 31 32 33 34 35 1

薄緑のセルの31です。
ですから、
     w=m[
5][0];
によってwに31が保存されます。
2行目
     m[5][0]=m[0][
5];
によって、座標(
)の値6が座標()に代入されて

   0  1 2 3 4 5
 0 36 2 3  4 5 6
 1 7 29 9 10 11 12
 2 13 14 22 16 17 18
 3 19 20 21 15 23 24
 4 25 26 27 28 8 30
 5 6 32 33 34 35 1

となります。
3行目
     m[0][5]=w;
によって、保存されていた値31が座標(
に入り

   0  1 2 3 4 5
 0 36 2 3  4 5 31
 1 7 29 9 10 11 12
 2 13 14 22 16 17 18
 3 19 20 21 15 23 24
 4 25 26 27 28 8 30
 5 6 32 33 34 35 1

4個目の交換が成立します。



   for(int i=0;i<3;i++){ //逆対角線交換
     w=m[5-i][i];
     m[5-i][i]=m[i][5-i];
     m[i][5-i]=w;
   }
のトレースの続き
i=1のとき、
     w=m[5-i][i];
     m[5-i][i]=m[i][5-i];
     m[i][5-i]=w;

     w=m[5-1][1];
     m[5-1][1]=m[1][5-1];
     m[1][5-1]=w;
すなわち、
     w=m[4][1];
     m[4][1]=m[1][4];
     m[1][4]=w;
です。
1行目
     w=m[4][1];
の右辺は座標()に対応していますから、

   0  1 2 3 4 5
 0 36 2 3  4 5 31
 1 7 29 9 10 11 12
 2 13 14 22 16 17 18
 3 19 20 21 15 23 24
 4 25 26 27 28 8 30
 5 6 32 33 34 35 1

薄緑のセルの26です。
ですから、
     w=m[
4][1];
によってwに26が保存されます。
2行目
     m[4][1]=m[1][
4];
によって、座標(
)の値11が座標()に代入されて

   0  1 2 3 4 5
 0 36 2 3  4 5 31
 1 7 29 9 10 11 12
 2 13 14 22 16 17 18
 3 19 20 21 15 23 24
 4 25 11 27 28 8 30
 5 6 32 33 34 35 1

となります。
3行目
     m[1][4]=w;
によって、保存されていた値26が座標(
に入り

   0  1 2 3 4 5
 0 36 2 3  4 5 31
 1 7 29 9 10 26 12
 2 13 14 22 16 17 18
 3 19 20 21 15 23 24
 4 25 11 27 28 8 30
 5 6 32 33 34 35 1

5個目の交換が成立します。


   for(int i=0;i<3;i++){ //逆対角線交換
     w=m[5-i][i];
     m[5-i][i]=m[i][5-i];
     m[i][5-i]=w;
   }
のトレースの続き
i=2のとき、
     w=m[5-i][i];
     m[5-i][i]=m[i][5-i];
     m[i][5-i]=w;

     w=m[5-2][2];
     m[5-2][2]=m[2][5-2];
     m[2][5-2]=w;
すなわち、
     w=m[3][2];
     m[3][2]=m[2][3];
     m[2][3]=w;
です。
1行目
     w=m[3][2];
の右辺は座標()に対応していますから、

   0  1 2 3 4 5
 0 36 2 3  4 5 31
 1 7 29 9 10 26 12
 2 13 14 22 16 17 18
 3 19 20 21 15 23 24
 4 25 11 27 28 8 30
 5 6 32 33 34 35 1

薄緑のセルの21です。
ですから、
     w=m[
3][2];
によってwに21が保存されます。
2行目
     m[3][2]=m[2][
3];
によって、座標(
)の値16が座標()に代入されて

   0  1 2 3 4 5
 0 36 2 3  4 5 31
 1 7 29 9 10 26 12
 2 13 14 22 16 17 18
 3 19 20 16 15 23 24
 4 25 11 27 28 8 30
 5 6 32 33 34 35 1

となります。
3行目
     m[2][3]=w;
によって、保存されていた値21が座標(
に入り

   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

6個目の交換が成立して、
逆対角線部分の交換が終了します。


実は、
void g(vector<vector<int>>::iterator m){
   int w;
   for(int i=0;i<3;i++){ //対角線交換
     w=m[
5-i][5-i];
     m[5-i][5-i]=m[i][i];
     m[i][i]=w;
   }

   for(int i=0;i<3;i++){ //逆対角線交換
     w=m[5-i][i];
     m[5-i][i]=m[i][5-i];
     m[i][5-i]=w;
   }
}

void g(vector<vector<int>>::iterator m){
   int w;
   for(int i=0;i<3;i++){ //対角線交換
     for(int j=0;j<6;j++){
        if(i==j || 5-j==i){
          w=m[5-i][5-j];
          m[5-i][5-j]=m[i][j];
          m[i][j]=w;
        }
     }
   }
}
でも可です。
この複雑な2次元for文を理解することが、
第5話、第6話の課題となります。

第3話へ 第5話へ



a

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

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