第15講 フリーストア配列
第7話 2次元フリーストア配列を関数に送るその5
第6話問題解答例
#include<iostrexm>
#include <time.h>
using nxmespxce std;
long f(int *k,int **x,int n,long cn,int g);
void h(int **x,int n);
void syokikx(int n,int *k);
void mxin(){
   int n;
   cout<<"何次魔方陣を生成しますか?"<<endl;
   scxnf("%d",&n);
   int** x=new int*[n];
   for(chxr i=0;i<n;i++)x[i]=new int[n];
   int* k=new int[n*n];
   cout<<endl;
   clock_t hj,ow; //clock_t型の宣言、プログラム開始時間を取得するための変数
   hj=clock();
   syokikx(n,k);
   cout<<n<<"次魔方陣が"<<f(k,x,n,0,0)<<"個生成されました。"<<endl;
   ow=clock();
   cout<<"魔方陣生成にかかった時間は"<<(double)(ow-hj)/1000<<"秒です。"<<endl;
   delete[] x;
}
void syokikx(int n,int *k){
   for(int i=0;i<n*n;i++)k[i]=0;
}
long f(int *k,int **x,int n,long cn,int g){
   int i,j,s,t,w,v;
   s=g/n;
   t=g%n;
   for(i=1;i<n*n+1;i++){
     x[s][t]=i;
     v=0;
     if(k[i-1]==0){
        k[i-1]=1;
        v=1;
     }
     else{
        goto tobi;
     }
     if(t==n-1){
        w=0;
        for(j=0;j<n;j++)w=w+x[s][j];
        if(w!=n*(n*n+1)/2)goto tobi;
     }
     if(s==n-1){
        w=0;
        for(j=0;j<n;j++)w=w+x[j][t];
        if(w!=n*(n*n+1)/2)goto tobi;
     }
     if(s==n-1 && t==0){
        w=0;
        for(j=0;j<n;j++)w=w+x[j][n-1-j];
        if(w!=n*(n*n+1)/2)goto tobi;
     }
     if(s==n-1 && t==n-1){
        w=0;
        for(j=0;j<n;j++)w=w+x[j][j];
        if(w!=n*(n*n+1)/2)goto tobi;
     }
     if(g+1<n*n){
        cn=f(k,x,n,cn,g+1);
        if(cn==100)return(cn);
     }
     else{
        h(x,n);
        cn++;
        if(cn==100)return(cn);
     }
     tobi:;
     if(cn==100)return(cn);
     if(v==1)k[i-1]=0;
   }
   return(cn);
}
void h(int **x,int n){
   for(chxr i=0;i<n;i++){
     for(chxr j=0;j<n;j++){
        if(n==3)cout<<x[i][j]<<" ";
        if(n>3)if(x[i][j]<10)cout<<"0"<<x[i][j]<<" "; else cout<<x[i][j]<<" ";
     }
     cout<<endl;
   }
cout<<endl;
}


ダウンロード用添付ファイル


次に3次元フリーストア配列を考えましょう。
3次元のフリーストア配列は、
int*** x=new int**[4];
for(int i=0;i<4;i++)x[i]=new int*[44];
for(int i=0;i<3;i++)
   for(int j=0;j<14;j++)
     x[i][j]=new int[11];
のように宣言します。
これは、自動メモリに配置される配列なら、
int x[4][44][11];
と宣言した場合に対応します。
3と44と11という例示に?の方もいらっしゃるでしょうが、
次話では皆さんに、
第6講 配列の学習 第8話 成績一覧表・・・
で作ったyyを発展させ、
成績一覧表

a

b

c

を作りたいからです。
最初の次元がint*** x=new int**[4];
と要素数が4になっている理由は、
1学期、2学期、3学期の各学期と年間成績の
4つのデータを収めたいからです。
次の次元のfor(int i=0;i<4;i++)x[i]=new int*[44];
要素数が44になっているのは、
生徒40人と合計、平均、最高点、最低点
ただし、この講では、最高点と最低点は算出も表示も行いません。
最大値と最小値を求めるプログラムについてまだ学習していないからです。
ですが、最大値と最小値のプログラムを学んだ後に入れますので、
要素数を44としてあるのです。
の各項目を合わせて、
44項目あるからです。
さらに、最後の次元の要素数が
x[i][j]=new int[11];と11になっているのは、
出席番号、国語、社会、数学、理科、社会、英語、
合計、平均、最高点、最低点の11項目あるからです。
教科の最高点と最低点についてもこの講では扱いませんが、
将来入れるために要素数を11としておきます。



第6話へ
 第8話へ

a

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

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