第21講 末項確定法
第4話 末講確定法最適乱数系列探索ソフトプログラム例(前半)

第4話では、末講確定法の最適乱数系列を探索するソフトのプログラム例をf1まで示しますので、
その後を皆さんご自分で考えてみてください。
#pragma endregion
      DateTime^ hj;
      DateTime^ ow;
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
        n=int::Parse(textBox1->Text);
        s=0;
        if(n%2==1)g1(n);
        if(n%2==0)g2(n);
        for(sk=0;sk<20000;sk++){
          hj=DateTime::Now;
          syokika();
          int i;
          srand(sk);
          f1(0);
          array<String^>^ w=gcnew array<String^>(16);
          ow=DateTime::Now;
          TimeSpan jsa=ow->Subtract(*hj);
          if(s>0){
            w[6]=n.ToString();w[7]="次";w[8]=sk.ToString();w[9]=L"";w[10]=L"時";w[11]=L"間";w[12]=L"計";w[13]=L"則";w[14]=L":"; w[15]=(jsa.TotalSeconds).ToString();
            for(i=0;i<6;i++)w[i]=L"";
            dataGridView1->Rows->Add(w);
            break;
          }
          s=0;
        }
      }
              ・
              ・
              ・
      void f1(int g){
        if(s==100)return;
        ow=DateTime::Now;
        TimeSpan jsa=ow->Subtract(*hj);
        if(jsa.TotalSeconds>0.01)return;

        int i,j,h,wa,kk,kkk,m,sa;
        if(g==n-1){
          wa=0;
          for(j=0;j<n-1;j++){
            wa+=a1[j][j];
          }
          sa=n*(n-1)/2-wa;
          if(sa<0 || sa>n-1)return;
          if(cn1[sa]>n-1)return;
          a1[y[g]][x[g]]=sa;
          cn1[sa]++;
          f1(g+1);
          ow=DateTime::Now;
          TimeSpan jsa=ow->Subtract(*hj);
          if(jsa.TotalSeconds>0.01)return;

          cn1[sa]--;
          return;
        }
        if(y[g]==n-1 && x[g]==0){
          wa=0;
          for(j=0;j<n-1;j++){
            wa+=a1[j][n-1-j];
          }
          sa=n*(n-1)/2-wa;
          if(sa<0 || sa>n-1)return;
          if(cn1[sa]>n-1)return;
          a1[y[g]][x[g]]=sa;
          cn1[sa]++;
          f1(g+1);
          ow=DateTime::Now;
          TimeSpan jsa=ow->Subtract(*hj);
          if(jsa.TotalSeconds>0.01)return;

          cn1[sa]--;
          return;
        }
        if(y[g]==0 && x[g]==n-2){
          wa=0;
          for(j=0;j<n-2;j++){
            wa+=a1[0][j];
          }
          wa+=a1[0][n-1];
          sa=n*(n-1)/2-wa;
          if(sa<0 || sa>n-1)return;
          if(cn1[sa]>n-1)return;
          a1[y[g]][x[g]]=sa;
          cn1[sa]++;
          f1(g+1);
          ow=DateTime::Now;
          TimeSpan jsa=ow->Subtract(*hj);
          if(jsa.TotalSeconds>0.01)return;

          cn1[sa]--;
          return;
       }
       if(y[g]==n-2 && x[g]==0){
          wa=0;
          for(j=0;j<n-2;j++){
            wa+=a1[j][0];
          }
          wa+=a1[n-1][0];
          sa=n*(n-1)/2-wa;
          if(sa<0 || sa>n-1)return;
          if(cn1[sa]>n-1)return;
          a1[y[g]][x[g]]=sa;
          cn1[sa]++;
          f1(g+1);
          ow=DateTime::Now;
          TimeSpan jsa=ow->Subtract(*hj);
          if(jsa.TotalSeconds>0.01)return;

          cn1[sa]--;
          return;
        }
        if(y[g]>0 && y[g]<n-1 && x[g]==n-1){
          wa=0;
          for(j=0;j<n-1;j++){
            wa+=a1[y[g]][j];
          }
          sa=n*(n-1)/2-wa;
          if(sa<0 || sa>n-1)return;
          if(cn1[sa]>n-1)return;
          a1[y[g]][x[g]]=sa;
          cn1[sa]++;
          f1(g+1);
          ow=DateTime::Now;
          TimeSpan jsa=ow->Subtract(*hj);
          if(jsa.TotalSeconds>0.01)return;

          cn1[sa]--;
          return;
        }
        if(x[g]>0 && x[g]<n-1 && y[g]==n-1){
          wa=0;
          for(j=0;j<n-1;j++){
            wa+=a1[j][x[g]];
          }
          sa=n*(n-1)/2-wa;
          if(sa<0 || sa>n-1)return;
          if(cn1[sa]>n-1)return;
          a1[y[g]][x[g]]=sa;
          cn1[sa]++;
          if(g<n*n-1){
            f1(g+1);
            ow=DateTime::Now;
            TimeSpan jsa=ow->Subtract(*hj);
            if(jsa.TotalSeconds>0.01)return;
            if(s==100)return;

         }
         else{
           f2(0);
           ow=DateTime::Now;
           TimeSpan jsa=ow->Subtract(*hj);
           if(jsa.TotalSeconds>0.01)return;
           if(s==100)return;
         }
        cn1[sa]--;
        return;
      }
      kk=rand()%n;
      m=n/2;
      for(i=0;i<n;i++){
        kkk=(kk+i)%n;
        a1[y[g]][x[g]]=kkk;
        h=1;
        cn1[kkk]++;
        f(cn1[kkk]>n)h=0;
        if(h==1)f1(g+1);
        ow=DateTime::Now;
        TimeSpan jsa=ow->Subtract(*hj);
        if(jsa.TotalSeconds>0.01)return;

        cn1[kkk]--;
     }
   }




第21講第3話へ 第21講第5話へ


VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座