第13講 ベクタを利用して4次魔方陣を作ろう!
第5話 for文を使用しないデータ交換関数gその1

実行結果
e
を導くプログラミング例
#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  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];

左辺は座標()に対応しますから、

 
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];
座標()の値1が座標()に入りますので、

 
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 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];
座標()の値6が座標()に入りますので、

 
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が座標(
)に入り

 
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];
座標()の値4が座標()に入りますので、

 
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 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];
座標()の値7が座標()に入りますので、

 
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が座標(
)に入り

 
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話へ



a

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

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