第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];
の右辺は座標(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];
によって、座標(0,5)の値6が座標(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 | 6 | 32 | 33 | 34 | 35 | 1 |
となります。
3行目
m[0][5]=w;
によって、保存されていた値31が座標(0,5)
に入り
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];
の右辺は座標(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];
によって、座標(1,4)の値11が座標(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 | 11 | 27 | 28 | 8 | 30 |
5 | 6 | 32 | 33 | 34 | 35 | 1 |
となります。
3行目
m[1][4]=w;
によって、保存されていた値26が座標(1,4)
に入り
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];
の右辺は座標(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];
によって、座標(2,3)の値16が座標(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 | 16 | 15 | 23 | 24 |
4 | 25 | 11 | 27 | 28 | 8 | 30 |
5 | 6 | 32 | 33 | 34 | 35 | 1 |
となります。
3行目
m[2][3]=w;
によって、保存されていた値21が座標(2,3)
に入り
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話へ
eclipse c++ 入門講義第1部へ
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ