第13講 ベクタを利用して4次魔方陣を作ろう!
第5話 for文を使用しないデータ交換関数gその1
実行結果
を導くプログラミング例
#include<iostream>
#include<vector>
using namespace std;
void f(vector<vector<int>>::iterator m);
void h(vector<vector<int>>::iterator m);
void g(vector<vector<int>>::iterator m);
void main(){
vector<vector<int>> m(4);
for(int i=0;i<4;i++)m[i].resize(4);
cout<<"自然配列"<<endl;
f(m.begin()); //自然配列作成
h(m.begin()); //自然配列表示
g(m.begin()); //データ交換
cout<<endl<<"4次魔方陣"<<endl;
h(m.begin()); //4次魔方陣表示
cout<<endl;
cout<<"プロジェクト終了";
}
void f(vector<vector<int>>::iterator m){
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
m[i][j]=4*i+j+1;
}
}
}
void h(vector<vector<int>>::iterator m){
int i,j,w;
w=0;
for(i=0;i<4;i++){
w=w+m[3-i][i];
}
cout<<" "<<w<<endl;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
if(m[i][j]<10)cout<<"0"<<m[i][j]<<"
"; else cout<<m[i][j]<<" ";
}
cout<<" ";
w=0;
for(j=0;j<4;j++)w=w+m[i][j];
cout<<w<<endl;
}
w=0;
for(i=0;i<4;i++){
w=w+m[i][i];
}
cout<<" "<<w<<endl;
for(i=0;i<4;i++){
w=0;
for(j=0;j<4;j++){
w=w+m[j][i];
}
cout<<w<<" ";
}
cout<<endl;
}
void g(vector<vector<int>>::iterator m){
int w;
w=m[3][3];
m[3][3]=m[0][0];
m[0][0]=w;
w=m[2][2];
m[2][2]=m[1][1];
m[1][1]=w;
w=m[3][0];
m[3][0]=m[0][3];
m[0][3]=w;
w=m[2][1];
m[2][1]=m[1][2];
m[1][2]=w;
}
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は座標を表してます。)
今からトレースしますが、座標の色対応に気をつけて下さい。
例えば、1行目の
w=m[3][3];
左辺は座標(3,3)に対応しますから、
0 | 1 | 2 | 3 | |
0 | 1 | 2 | 3 | 4 |
1 | 5 | 6 | 7 | 8 |
2 | 9 | 10 | 11 | 12 |
3 | 13 | 14 | 15 | 16 |
m[3][3]は16です。
ですから、1行目
w=m[3][3];
によって、wに16が保存されます。
そして、2行目
m[3][3]=m[0][0];
座標(0,0)の値1が座標(3,3)に入りますので、
0 | 1 | 2 | 3 | |
0 | 1 | 2 | 3 | 4 |
1 | 5 | 6 | 7 | 8 |
2 | 9 | 10 | 11 | 12 |
3 | 13 | 14 | 15 | 1 |
となります。
最後に3行目
m[0][0]=w;
によって保存されていた16が座標(0,0)に入り
0 | 1 | 2 | 3 | |
0 | 16 | 2 | 3 | 4 |
1 | 5 | 6 | 7 | 8 |
2 | 9 | 10 | 11 | 12 |
3 | 13 | 14 | 15 | 1 |
1個目の交換が成り立ちます。
4行目
w=m[2][2];
によって、wに11が保存されます。
5行目
m[2][2]=m[1][1];
座標(1,1)の値6が座標(2,2)に入りますので、
0 | 1 | 2 | 3 | |
0 | 16 | 2 | 3 | 4 |
1 | 5 | 6 | 7 | 8 |
2 | 9 | 10 | 6 | 12 |
3 | 13 | 14 | 15 | 1 |
となります。
6行目
m[2][2]=w;
によって保存されていた11が座標(1,1)に入り
0 | 1 | 2 | 3 | |
0 | 16 | 2 | 3 | 4 |
1 | 5 | 11 | 7 | 8 |
2 | 9 | 10 | 6 | 12 |
3 | 13 | 14 | 15 | 1 |
2個目の交換が成り立ちます。
7行目
w=m[3][0];
によって、wに13が保存されます。
そして、8行目
m[3][0]=m[0][3];
座標(0,3)の値4が座標(3,0)に入りますので、
0 | 1 | 2 | 3 | |
0 | 16 | 2 | 3 | 4 |
1 | 5 | 11 | 7 | 8 |
2 | 9 | 10 | 6 | 12 |
3 | 4 | 14 | 15 | 1 |
となります。
9行目
m[0][3]=w;
によって保存されていた13が座標(0,3)に入り
0 | 1 | 2 | 3 | |
0 | 16 | 2 | 3 | 13 |
1 | 5 | 11 | 7 | 8 |
2 | 9 | 10 | 6 | 12 |
3 | 4 | 14 | 15 | 1 |
3個目の交換が成り立ちます。
10行目
w=m[2][1];
によって、wに10が保存されます。
11行目
m[2][1]=m[1][2];
座標(1,2)の値7が座標(2,1)に入りますので、
0 | 1 | 2 | 3 | |
0 | 16 | 2 | 3 | 13 |
1 | 5 | 11 | 7 | 8 |
2 | 9 | 7 | 6 | 12 |
3 | 4 | 14 | 15 | 1 |
となります。
12行目
m[1][2]=w;
によって保存されていた10が座標(1,2)に入り
0 | 1 | 2 | 3 | |
0 | 16 | 2 | 3 | 13 |
1 | 5 | 11 | 10 | 8 |
2 | 9 | 7 | 6 | 12 |
3 | 4 | 14 | 15 | 1 |
4個目の交換が成り立ちます。
こうして4次魔方陣が完成するのです。
では、gの中身をfor文で組み直しましょう。
gの真ん中で1行開けてあるのは、
それぞれをfor文で組むという意味です。
第4話へ 第6話へ
eclipse c++ 入門講義第1部へ
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ