第14講 ベクタを利用して6次魔方陣を作ろう!
第6話 第2のコードのトレースその2
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;
}
}
}
}
のトーレスの続き
i=1の場合
j=0のとき
if(i==j || 5-j==i)
は
if(1==0 || 5==1)
if文は実行されません。
j=1のとき
if(i==j || 5-j==i)
は
if(1==1 || 4==1)
if文の条件が満たされ
w=m[5-i][5-j];
m[5-i][5-j]=m[i][j];
m[i][j]=w;
の部分が実行されます。
i=1,j=1ですから
w=m[5-1][5-1];
m[5-1][5-1]=m[1][1];
m[1][1]=w;
すなわち、
w=m[4][4];
m[4][4]=m[1][1];
m[1][1]=w;
これは座標(4,4)と(1,1)の交換ですから
0 | 1 | 2 | 3 | 4 | 5 | |
0 | 36 | 2 | 3 | 4 | 5 | 31 |
1 | 7 | 29 | 9 | 10 | 11 | 12 |
2 | 13 | 14 | 15 | 16 | 17 | 18 |
3 | 19 | 20 | 21 | 22 | 23 | 24 |
4 | 25 | 26 | 27 | 28 | 8 | 30 |
5 | 6 | 32 | 33 | 34 | 35 | 1 |
と3個目の交換が成立します。
j=2のとき、
i=1ですから
if(i==j || 5-j==i)
は
if(1==2 || 3==1)
となり、if文の条件を満たしません。
したがって、if文は実行されません。
j=3のとき、
if(i==j || 5-j==i)
は
if(1==3 || 2==1)
となり、if文の条件を満たしません。
したがって、if文は実行されません。
j=4のとき、
if(i==j || 5-j==i)
は
if(1==4 || 4==4)
となり、if文の条件を満たし、
w=m[5-i][5-j];
m[5-i][5-j]=m[i][j];
m[i][j]=w;
の部分が実行されます。
i=1,j=4ですから
w=m[5-1][5-4];
m[5-1][5-4]=m[1][4];
m[1][4]=w;
すなわち、
w=m[4][1];
m[4][1]=m[1][4];
m[1][4]=w;
これは座標(4,1)と(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 | 15 | 16 | 17 | 18 |
3 | 19 | 20 | 21 | 22 | 23 | 24 |
4 | 25 | 11 | 27 | 28 | 8 | 30 |
5 | 6 | 32 | 33 | 34 | 35 | 1 |
と4個目の交換が成立します。
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;
}
}
}
}
のトーレスの続き
i=2の場合
j=0のとき
if(i==j || 5-j==i)
は
if(2==0 || 5==2)
if文は実行されません。
j=1のとき
if(i==j || 5-j==i)
は
if(2==1 || 4==2)
if文は実行されません。
j=2のとき、
i=2ですから
if(i==j || 5-j==i)
は
if(2==2 || 3==2)
となり、if文の条件を満たし、
w=m[5-i][5-j];
m[5-i][5-j]=m[i][j];
m[i][j]=w;
の部分が実行されます。
i=2,j=2ですから
w=m[5-2][5-2];
m[5-2][5-2]=m[2][2];
m[2][2]=w;
すなわち、
w=m[3][3];
m[3][3]=m[2][2];
m[2][2]=w;
これは座標(3,3)と(2,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 |
と5個目の交換が成立します。
j=3のとき、
if(i==j || 5-j==i)
は
if(2==3 || 2==2)
となり、if文の条件を満たし、
w=m[5-i][5-j];
m[5-i][5-j]=m[i][j];
m[i][j]=w;
の部分が実行されます。
i=2,j=3ですから
w=m[5-2][5-3];
m[5-2][5-3]=m[2][3];
m[2][3]=w;
すなわち、
w=m[3][2];
m[3][2]=m[2][3];
m[2][3]=w;
これは座標(3,2)と(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個目の交換が成立します。
j=4のとき
if(i==j || 5-j==i)
は
if(2==4 || 1==2)
if文は実行されません。
j=5のとき
if(i==j || 5-j==i)
は
if(2==5 || 0==2)
if文は実行されません。
以上で確かに、
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 |
対角線と逆対角線の交換がすべて成立しています。
でも、皆さんトレースすると成り立つことは分かりますが、
木を見て森を見ない・・・の心境ではありませんか。
鎖の一つ一つの繋がりは理解できても
鎖が描く全体像は見えない!
という印象ではないでしょうか。
全体を把握すること・・・
これが右脳数学に求められる最も肝要な点です。
プログラミングも個々の論理が追えても、
全体を直観的に俯瞰できない限り、
理解とはいえません。
次話では全体像を見ることにしましょう。
第5話へ 第7話へ
eclipse c++ 入門講義第1部へ
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ