第19講 .NETによるマルチスレッドプログラミング
第7話 Parameterizedによって関数を1つにまとめる
コード例
#include<iostream>
using namespace std;
using namespace System;
using namespace System::Threading;
void f0();
void t(Object^ a);
void f1(char p,char g);
void f2(char p);
void g(char p);
int n,cn[4];
int m[4][2000][10][10],a[4][10][10],x[100],y[100];
int main(){
  cout<<"何次魔方陣を作成させるのかキーボードから入力してください。"<<endl;
  cout<<"次数=";
  scanf("%d",&n);
  DateTime^ hj=DateTime::Now;
  f0();
  Thread^ p=gcnew Thread(gcnew ParameterizedThreadStart(t));
  Thread^ q=gcnew Thread(gcnew ParameterizedThreadStart(t));
  Thread^ r=gcnew Thread(gcnew ParameterizedThreadStart(t));
  Thread^ s=gcnew Thread(gcnew ParameterizedThreadStart(t));
  p->Start(0);
  q->Start(1);
  r->Start(2);
  s->Start(3);
  p->Join();
  q->Join();
  r->Join();
  s->Join();
  //for(int i=0;i<4;i++)g(i);
  cout<<n<<"次魔方陣が"<<cn[0]+cn[1]+cn[2]+cn[3]<<"個できました。"<<endl;
  DateTime^ ow=DateTime::Now;
  TimeSpan sa=ow->Subtract(*hj);
  cout<<"計算時間は"<<sa.TotalSeconds<<"秒です。"<<endl;
  /*
  int i,j,c[10][10];
  for(i=0;i<n*n;i++){
    c[y[i]][x[i]]=i;
  }
  for(i=0;i<n;i++){
    for(j=0;j<n;j++){
      if(c[i][j]<10)cout<<" "<<c[i][j]<<" ";
      if(c[i][j]>=10)cout<<c[i][j]<<" ";
    }
    cout<<endl;
  }
  */
}
void f0(){
  int i,j,c=0;
  int b[10][10];
  for(i=0;i<n;i++){
    for(j=0;j<n;j++){
      b[i][j]=-1;
    }
  }
  for(i=0;i<n;i++){
    b[i][i]=i;
  }
  c=n-1;
  for(i=0;i<n;i++){
    if(b[i][n-1-i]==-1){
      c++;
      b[i][n-1-i]=c;
    }
  }
  for(i=0;i<n;i++){
    for(j=0;j<n;j++){
      if(b[i][j]==-1){
        c++;
        b[i][j]=c;
      }
    }
  }
  for(i=0;i<n;i++){
    for(j=0;j<n;j++){
      x[b[i][j]]=j;
      y[b[i][j]]=i;
    }
  }
}
void t(Object^ a){
  char i;
  i=(Int32)a;
  cn[i]=0;
  f1(i,0);
}
void f1(char p,char g){
  char i,j,ii;
  char h,w,hh=1;
  for(i=1;i<n*n+1;i++){
    if(p==0)if(g==0 && i>n*n/4)break;
    if(p==1){
      if(g==0){
        if(hh==1){
          i+=n*n/4;
          hh=2;
        }
        if(i>n*n/2)break;
      }
    }
    if(p==2){
      if(g==0){
        if(hh==1){
          i+=n*n/2;
          hh=2;
        }
        if(i>3*n*n/4)break;
      }
    }
    if(p==3){
      if(g==0){
        if(hh==1){
          i+=3*n*n/4;
          hh=2;
        }
      }
    }
    a[p][y[g]][x[g]]=i;
    h=1;
    if(g>0){
      for(j=0;j<g;j++){
        if(a[p][y[g]][x[g]]==a[p][y[j]][x[j]]){
          h=0;
          break;
        }
      }
    }
    if(h==1 && y[g]==n-1 && x[g]==n-1){
      w=0;
      for(j=0;j<n;j++){
        w+=a[p][j][j];
      }
      if(w!=n*(n*n+1)/2)h=0;
    }
    if(h==1 && y[g]==n-1 && x[g]==0){
      w=0;
      for(j=0;j<n;j++){
        w+=a[p][n-1-j][j];
      }
      if(w!=n*(n*n+1)/2)h=0;
    }
    if(h==1 && y[g]==0 && x[g]==n-2){
      w=0;
      for(j=0;j<n;j++){
        w+=a[p][y[g]][j];
      }
      if(w!=n*(n*n+1)/2)h=0;
    }
    if(h==1 && g>n && x[g]==n-1){
      w=0;
      for(j=0;j<n;j++){
        w+=a[p][y[g]][j];
      }
      if(w!=n*(n*n+1)/2)h=0;
    }
    if(h==1 && y[g]==n-2 && x[g]==0){
      w=0;
      for(j=0;j<n;j++){
        w+=a[p][j][x[g]];
      }
      if(w!=n*(n*n+1)/2)h=0;
    }
    if(h==1 && g>2*n-1 && y[g]==n-1){
      w=0;
      for(j=0;j<n;j++){
        w+=a[p][j][x[g]];
      }
      if(w!=n*(n*n+1)/2)h=0;
    }

    if(h==1){
      if(g+1<n*n){
        f1(p,g+1);
       }
       else{
        cn[p]++;
        f2(p);
        //if(cn[i]==2000)break;
       }
    }
    //if(cn[i]==2000)break;
  }
}

void f2(char p){
  int i,j;
  for(i=0;i<n;i++){
    for(j=0;j<n;j++){
      m[p][cn[p]-1][i][j]=a[p][i][j];
    }
  }
}
void g(char p){
  int i,j,k;
  for(i=0;i<cn[i];i++){
    for(j=0;j<n;j++){
      for(k=0;k<n;k++){
        if(m[p][i][j][k]<10)cout<<" "<<m[p][i][j][k]<<" ";
        if(m[p][i][j][k]>=10)cout<<m[p][i][j][k]<<" ";
      }
      cout<<endl;
    }
    cout<<endl;
  }

}
入門
Parameteriedによってかなりすっきしました。
すっきりさせる際のポイントは、cn1などの配列にすることです。
それで
void t(Object^ a){
  char i;
  i=(Int32)a;
  cn[i]=0;
  f1(i,0);
}
とすっきりさせることができました。

第6話へ 第20講第1話へ

戻る

C言語 C++講義第1部へ
VB講義へ
VB講義基礎へ

vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)