第21講 末項確定法
第3話 f2解答例

void f2(int g){
  if(s==100)return;
  int i,j,k,h,wa,kk,kkk,m,yy,hh,sa;
  yy=a1[y[g]][x[g]];
  array<String^>^ w=gcnew array<String^>(16);
  if(g==n-1){
    wa=0;
    for(j=0;j<n-1;j++){
      wa+=a2[j][j];
    }
    sa=n*(n-1)/2-wa;
    if(sa<0 || sa>n-1)return;
    if(p[yy][sa]==1)return;
    if(cn2[sa]>n-1)return;
    a2[y[g]][x[g]]=sa;
    p[yy][sa]=1;
    cn2[sa]++;
    f2(g+1);
    cn2[sa]--;
    p[yy][sa]=0;
    return;
  }
  if(y[g]==n-1 && x[g]==0){
    wa=0;
    for(j=0;j<n-1;j++){
      wa+=a2[j][n-1-j];
    }
    sa=n*(n-1)/2-wa;
    if(sa<0 || sa>n-1)return;
    if(p[yy][sa]==1)return;
    if(cn2[sa]>n-1)return;
    a2[y[g]][x[g]]=sa;
    p[yy][sa]=1;
    cn2[sa]++;
    f2(g+1);
    cn2[sa]--;
    p[yy][sa]=0;
    return;
  }
  if(y[g]==0 && x[g]==n-2){
    wa=0;
    for(j=0;j<n-2;j++){
      wa+=a2[0][j];
    }  
    wa+=a2[0][n-1];
    sa=n*(n-1)/2-wa;
    if(sa<0 || sa>n-1)return;
    if(p[yy][sa]==1)return;
    if(cn2[sa]>n-1)return;
    a2[y[g]][x[g]]=sa;
    p[yy][sa]=1;
    cn2[sa]++;
    f2(g+1);
    cn2[sa]--;
    p[yy][sa]=0;
    return;
  }
  if(y[g]==n-2 && x[g]==0){
    wa=0;
    for(j=0;j<n-2;j++){
      wa+=a2[j][0];
    }
    wa+=a2[n-1][0];
    sa=n*(n-1)/2-wa;
    if(sa<0 || sa>n-1)return;
    if(p[yy][sa]==1)return;
    if(cn2[sa]>n-1)return;
    a2[y[g]][x[g]]=sa;
    p[yy][sa]=1;
    cn2[sa]++;
    f2(g+1);
    cn2[sa]--;
    p[yy][sa]=0;
    return;
  }
  if(y[g]>0 && y[g]<n-1 && x[g]==n-1){
    wa=0;
    for(j=0;j<n-1;j++){
      wa+=a2[y[g]][j];
    }
    sa=n*(n-1)/2-wa;
    if(sa<0 || sa>n-1)return;
    if(p[yy][sa]==1)return;
    if(cn2[sa]>n-1)return;
    a2[y[g]][x[g]]=sa;
    p[yy][sa]=1;
    cn2[sa]++;
    f2(g+1);
    cn2[sa]--;
    p[yy][sa]=0;
    return;
  }
  if(x[g]>0 && x[g]<n-1 && y[g]==n-1){
    wa=0;
    for(j=0;j<n-1;j++){
      wa+=a2[j][x[g]];
    }
    sa=n*(n-1)/2-wa;
    if(sa<0 || sa>n-1)return;
    if(p[yy][sa]==1)return;
    if(cn2[sa]>n-1)return;
    a2[y[g]][x[g]]=sa;
    p[yy][sa]=1;
    cn2[sa]++;
    if(g<n*n-1){
      f2(g+1);
    }
    else{
      for(j=0;j<n;j++){
        for(k=0;k<n;k++){
          w[k]=(n*a1[j][k]+a2[j][k]+1).ToString();
        }
        dataGridView1->Rows->Add(w);
     }
     for(j=0;j<16;j++)w[j]=L"";
     dataGridView1->Rows->Add(w);

     s++;
     if(s==100)return;
    }
    cn2[sa]--;
    p[yy][sa]=0;
    return;
  }
  kk=rand()%n;
  m=n/2;
  for(i=0;i<n;i++){
    kkk=(kk+i)%n;
    a2[y[g]][x[g]]=kkk;
    h=1;
    cn2[kkk]++;
    if(cn2[kkk]>n)h=0;
    hh=0;
    if(h==1){
      if(p[yy][kkk]==0){
        p[yy][kkk]=1;
        hh=1;
       }
      else{
        h=0;
      }
    }
    if(h==1)f2(g+1);
    if(hh==1)p[yy][kkk]=0;
    cn2[kkk]--;
  }
}

ダウンロードファイルForm5.h(フォルダに貼り付けるときはForm1.hに名称を変更してください。)


第21講第2話へ 第21講第4話へ



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