第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]--;
}
}
VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual
Basic入門基礎講座