第13講 ベクタを利用して4次魔方陣を作ろう!
第8話 for文を用いないデータ交換関数gその2
0 | 1 | 2 | 3 | |
0 | 1 | 2 | 3 | 4 |
1 | 5 | 6 | 7 | 8 |
2 | 9 | 10 | 11 | 12 |
3 | 13 | 14 | 15 | 16 |
↓
0 | 1 | 2 | 3 | |
0 | 1 | 15 | 14 | 4 |
1 | 12 | 6 | 7 | 9 |
2 | 8 | 10 | 11 | 5 |
3 | 13 | 3 | 2 | 16 |
(一番外側の青とピンクの0,1,2,3は座標を表しています。)
を実現するプログラム例
g以前までは、プログラムは同一
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;
}
色の対応に気をつけて下さい。
例えば、m[3][2]は
0 | 1 | 2 | 3 | |
0 | 1 | 2 | 3 | 4 |
1 | 5 | 6 | 7 | 8 |
2 | 9 | 10 | 11 | 12 |
3 | 13 | 14 | 15 | 16 |
座標(3,2)で15のある緑のセルです。
ですから、1行目
w=m[3][2];
によってwには15が入ります。
15が保存されたわけです。
そして2行目
m[3][2]=m[0][1];
によって、
0 | 1 | 2 | 3 | |
0 | 1 | 2 | 3 | 4 |
1 | 5 | 6 | 7 | 8 |
2 | 9 | 10 | 11 | 12 |
3 | 13 | 14 | 2 | 16 |
となっています。
さらに、3行目
m[0][1]=w;
によって保存されていた15が座標(0,1)に入り、
0 | 1 | 2 | 3 | |
0 | 1 | 15 | 3 | 4 |
1 | 5 | 6 | 7 | 8 |
2 | 9 | 10 | 11 | 12 |
3 | 13 | 14 | 2 | 16 |
最初の交換が成立するわけです。
次の4行目の
w=m[3][1];
右辺の対象セルは
0 | 1 | 2 | 3 | |
0 | 1 | 15 | 3 | 4 |
1 | 5 | 6 | 7 | 8 |
2 | 9 | 10 | 11 | 12 |
3 | 13 | 14 | 2 | 16 |
緑のセルですから、
w=m[3][1];
によって、14がwに保存されます。
5行目
m[3][1]=m[0][2];
により
0 | 1 | 2 | 3 | |
0 | 1 | 15 | 3 | 4 |
1 | 5 | 6 | 7 | 8 |
2 | 9 | 10 | 11 | 12 |
3 | 13 | 3 | 2 | 16 |
となります。
6行目
m[0][2]=w;
により保存されていた14が座標(0,2)に入り
0 | 1 | 2 | 3 | |
0 | 1 | 15 | 14 | 4 |
1 | 5 | 6 | 7 | 8 |
2 | 9 | 10 | 11 | 12 |
3 | 13 | 3 | 2 | 16 |
2個目の交換が成功します。
7行目の
w=m[2][3];
右辺の対象セルは
0 | 1 | 2 | 3 | |
0 | 1 | 15 | 14 | 4 |
1 | 5 | 6 | 7 | 8 |
2 | 9 | 10 | 11 | 12 |
3 | 13 | 3 | 2 | 16 |
緑のセルですから、
w=m[2][3];
によって、12がwに保存されます。
8行目
m[2][3]=m[1][0];
により
0 | 1 | 2 | 3 | |
0 | 1 | 15 | 3 | 4 |
1 | 5 | 6 | 7 | 8 |
2 | 9 | 10 | 11 | 5 |
3 | 13 | 3 | 2 | 16 |
となります。
9行目
m[1][0]=w;
により保存されていた12が座標(1,0)に入り
0 | 1 | 2 | 3 | |
0 | 1 | 15 | 14 | 4 |
1 | 12 | 6 | 7 | 8 |
2 | 9 | 10 | 11 | 5 |
3 | 13 | 3 | 2 | 16 |
3個目の交換が成功します。
10行目の
w=m[1][3];
右辺の対象セルは
0 | 1 | 2 | 3 | |
0 | 1 | 15 | 14 | 4 |
1 | 12 | 6 | 7 | 8 |
2 | 9 | 10 | 11 | 5 |
3 | 13 | 3 | 2 | 16 |
緑のセルですから、
w=m[1][3];
によって、8がwに保存されます。
11行目
m[1][3]=m[2][0];
により
0 | 1 | 2 | 3 | |
0 | 1 | 15 | 3 | 4 |
1 | 12 | 6 | 7 | 9 |
2 | 9 | 10 | 11 | 5 |
3 | 13 | 3 | 2 | 16 |
となります。
12行目
m[2][0]=w;
により保存されていた8が座標(2,0)に入り
0 | 1 | 2 | 3 | |
0 | 1 | 15 | 14 | 4 |
1 | 12 | 6 | 7 | 9 |
2 | 8 | 10 | 11 | 5 |
3 | 13 | 3 | 2 | 16 |
4個目の交換が成功して4次魔方陣の完成というわけです。
eclipse c++ 入門講義第1部へ
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ