第19講 特殊種による魔方陣ソフトの高速化
第2話 特殊種ソフトソース例

今回は、今までで一番難解なソースかもしれません。
何回も組んでいる私でさえ、2,3時間はかかったでしょうか。
初心者にとっては超超ド級の難解なソースです。
3話かけて詳しく説明していきますので、どうか諦めないで最後までついてきて頂ければと思います。
1行1行解説していきます。
諦めなければ、必ず理解できるとお約束いたします。

#pragma endregion
  private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
          DateTime^ hj=DateTime::Now;
          n=int::Parse(textBox1->Text);
          s=0;
          if(n%2==1)g1(n);
          if(n%2==0)g2(n);
          f(0);
          int i;
          array<String^>^ w=gcnew array<String^>(16);
          w[9]=L"特";w[10]=L"殊";w[11]=L"種";w[12]=L"総";w[13]=L"数";w[14]=L":";w[15]=s.ToString();
          for(i=0;i<9;i++)w[i]=L"";
          dataGridView1->Rows->Add(w);
          DateTime^ ow=DateTime::Now;
          TimeSpan sa=ow->Subtract(*hj);
          w[10]=L"時";w[11]=L"間";w[12]=L"計";w[13]=L"則";w[14]=L":";w[15]=(sa.TotalSeconds).ToString();
          for(i=0;i<10;i++)w[i]=L"";
          dataGridView1->Rows->Add(w);
       }
       void g1(char n){
          char i,m;
          m=n/2;
          for(i=0;i<n*n;i++){
            if(i<n){
              x[i]=i;
              y[i]=i;
            }
            else if(i<2*n-1){
              x[i]=2*n-i-1;
              y[i]=i-n;
              if(x[i]<=y[i]){
                 x[i]--;
                 y[i]++;
              }
            }
            else if(i<2*n+(n*n-3*n)/2){
              x[i]=(i-2*n+1)%(n-2);
              y[i]=(i-2*n+1)/(n-2);
              if(x[i]>=y[i])x[i]++;
              if(x[i]>=n-y[i]-1)x[i]++;
            }
            else if(i<3*n-1+(n*n-3*n)/2){
              x[i]=i-2*n-(n*n-3*n)/2;
              y[i]=m;
              if(x[i]>=y[i])x[i]++;
            }
            else{
              x[i]=(i-2*n)%(n-2);
              y[i]=(i-2*n)/(n-2);
              if(x[i]>=n-y[i]-1)x[i]++;
              if(x[i]>=y[i])x[i]++;
            }
         }
       }
       void g2(char n){
         char i,m;
         m=n/2;
         for(i=0;i<n*n;i++){
           if(i<n){
             x[i]=i;
             y[i]=i;
           }
           else if(i<2*n){
             x[i]=2*n-i-1;
             y[i]=i-n;
           }
           else if(i<(m+1)*n){
             x[i]=(i-2*n)%(n-2);
             y[i]=(i-2*n)/(n-2);
             if(x[i]>=y[i])x[i]++;
             if(x[i]>=n-y[i]-1)x[i]++;
           }
           else{
             x[i]=(i-2*n)%(n-2);
             y[i]=(i-2*n)/(n-2);
             if(x[i]>=n-y[i]-1)x[i]++;
             if(x[i]>=y[i])x[i]++;
           }
         }
       }
       void f(char g){
         if(s==1000)return;
         int i,j,k,h,wa,kk,kkk,m;
         array<String^>^ w=gcnew array<String^>(16);
         rand();
         rand();
         kk=rand()%n;
         m=n/2;
         for(i=0;i<n;i++){
           kkk=(kk+i)%n;
           a[y[g]][x[g]]=kkk;
           h=1;
           if(g<n){
             for(j=0;j<g;j++){
               if(a[y[g]][x[g]]==a[j][j]){
                 h=0;
                 break;
               }
             }
           }
           if(h==1){
             if(x[g]==n-y[g]-1 && g>n-1){
               if(a[y[g]][x[g]]==a[y[g]][y[g]])h=0;
               if(h==1)if(a[y[g]][x[g]]==a[x[g]][x[g]])h=0;
               if(n%2==1)if(a[y[g]][x[g]]==a[m][m])h=0;
               if(h==1 && y[g]>0){
                 for(j=0;j<y[g];j++){
                   if(a[y[g]][x[g]]==a[j][n-j-1]){
                     h=0;
                     break;
                   }
                 
               }
             }
           }
           if(h==1){
             if(n%2==1 && g>2*n-2){
               if(a[y[g]][x[g]]==a[x[g]][x[g]])h=0;
               if(h==1)if(a[y[g]][x[g]]==a[y[g]][y[g]])h=0;
               if(h==1)if(a[y[g]][x[g]]==a[y[g]][n-y[g]-1])h=0;
               if(h==1)if(a[y[g]][x[g]]==a[n-x[g]-1][x[g]])h=0;
             }
             if(n%2==0 && g>2*n-1){
               if(a[y[g]][x[g]]==a[x[g]][x[g]])h=0;
               if(h==1)if(a[y[g]][x[g]]==a[y[g]][y[g]])h=0;
               if(h==1)if(a[y[g]][x[g]]==a[y[g]][n-y[g]-1])h=0;
               if(h==1)if(a[y[g]][x[g]]==a[n-x[g]-1][x[g]])h=0;
             }
             if(h==1 && g>2*n-2 && x[g]>0){
               for(j=0;j<x[g];j++){
                 if(a[y[g]][x[g]]==a[y[g]][j]){
                   h=0;
                   break;
                 }
               }
             } 
           }
           if(h==1){
             if(g>3*n-4){
               if(h==1 && y[g]>0){
                 for(j=0;j<y[g];j++){
                   if(a[y[g]][x[g]]==a[j][x[g]]){
                     h=0;
                     break;
                   }
                 }
               }
             }
           }
           if(h==1){
             if(g<n*n-1){
               f(g+1);
             }
             else{
               for(j=0;j<n;j++){
                 for(k=0;k<n;k++){
                   w[k]=(a[j][k]).ToString();
                 }
                 dataGridView1->Rows->Add(w);
               }
               for(j=0;j<16;j++)w[j]=L"";
               dataGridView1->Rows->Add(w);
               s++;
               if(s==1000)return;
            }
          }
        }
      }
  };
}



(コピーペースト用


#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
DateTime^ hj=DateTime::Now;
n=int::Parse(textBox1->Text);
s=0;
if(n%2==1)g1(n);
if(n%2==0)g2(n);
f(0);
int i;
array<String^>^ w=gcnew array<String^>(16);
w[9]=L"特";w[10]=L"殊";w[11]=L"種";w[12]=L"総";w[13]=L"数";w[14]=L":";w[15]=s.ToString();
for(i=0;i<9;i++)w[i]=L"";
dataGridView1->Rows->Add(w);
DateTime^ ow=DateTime::Now;
TimeSpan sa=ow->Subtract(*hj);
w[10]=L"時";w[11]=L"間";w[12]=L"計";w[13]=L"則";w[14]=L":";w[15]=(sa.TotalSeconds).ToString();
for(i=0;i<10;i++)w[i]=L"";
dataGridView1->Rows->Add(w);
}
void g1(char n){
char i,m;
m=n/2;
for(i=0;i<n*n;i++){
if(i<n){
x[i]=i;
y[i]=i;
}
else if(i<2*n-1){
x[i]=2*n-i-1;
y[i]=i-n;
if(x[i]<=y[i]){
x[i]--;
y[i]++;
}
}
else if(i<2*n+(n*n-3*n)/2){
x[i]=(i-2*n+1)%(n-2);
y[i]=(i-2*n+1)/(n-2);
if(x[i]>=y[i])x[i]++;
if(x[i]>=n-y[i]-1)x[i]++;
}
else if(i<3*n-1+(n*n-3*n)/2){
x[i]=i-2*n-(n*n-3*n)/2;
y[i]=m;
if(x[i]>=y[i])x[i]++;
}
else{
x[i]=(i-2*n)%(n-2);
y[i]=(i-2*n)/(n-2);
if(x[i]>=n-y[i]-1)x[i]++;
if(x[i]>=y[i])x[i]++;
}
}
}
void g2(char n){
char i,m;
m=n/2;
for(i=0;i<n*n;i++){
if(i<n){
x[i]=i;
y[i]=i;
}
else if(i<2*n){
x[i]=2*n-i-1;
y[i]=i-n;
}
else if(i<(m+1)*n){
x[i]=(i-2*n)%(n-2);
y[i]=(i-2*n)/(n-2);
if(x[i]>=y[i])x[i]++;
if(x[i]>=n-y[i]-1)x[i]++;
}
else{
x[i]=(i-2*n)%(n-2);
y[i]=(i-2*n)/(n-2);
if(x[i]>=n-y[i]-1)x[i]++;
if(x[i]>=y[i])x[i]++;
}
}

}
void f(char g){
if(s==1000)return;
int i,j,k,h,wa,kk,kkk,m;
array<String^>^ w=gcnew array<String^>(16);
rand();
rand();
kk=rand()%n;
m=n/2;
for(i=0;i<n;i++){
kkk=(kk+i)%n;
a[y[g]][x[g]]=kkk;
h=1;

if(g<n){
for(j=0;j<g;j++){
if(a[y[g]][x[g]]==a[j][j]){
h=0;
break;
}
}
}
if(h==1){
if(x[g]==n-y[g]-1 && g>n-1){
if(a[y[g]][x[g]]==a[y[g]][y[g]])h=0;
if(h==1)if(a[y[g]][x[g]]==a[x[g]][x[g]])h=0;
if(n%2==1)if(a[y[g]][x[g]]==a[m][m])h=0;
if(h==1 && y[g]>0){
for(j=0;j<y[g];j++){
if(a[y[g]][x[g]]==a[j][n-j-1]){
h=0;
break;
}
}
}
}
}
if(h==1){
if(n%2==1 && g>2*n-2){
if(a[y[g]][x[g]]==a[x[g]][x[g]])h=0;
if(h==1)if(a[y[g]][x[g]]==a[y[g]][y[g]])h=0;
if(h==1)if(a[y[g]][x[g]]==a[y[g]][n-y[g]-1])h=0;
if(h==1)if(a[y[g]][x[g]]==a[n-x[g]-1][x[g]])h=0;
}
if(n%2==0 && g>2*n-1){
if(a[y[g]][x[g]]==a[x[g]][x[g]])h=0;
if(h==1)if(a[y[g]][x[g]]==a[y[g]][y[g]])h=0;
if(h==1)if(a[y[g]][x[g]]==a[y[g]][n-y[g]-1])h=0;
if(h==1)if(a[y[g]][x[g]]==a[n-x[g]-1][x[g]])h=0;
}

if(h==1 && g>2*n-2 && x[g]>0){
for(j=0;j<x[g];j++){
if(a[y[g]][x[g]]==a[y[g]][j]){
h=0;
break;
}
}
}

}

if(h==1){
if(g>3*n-4){
if(h==1 && y[g]>0){
for(j=0;j<y[g];j++){
if(a[y[g]][x[g]]==a[j][x[g]]){
h=0;
break;
}
}
}
}
}
if(h==1){
if(g<n*n-1){
f(g+1);
}
else{
for(j=0;j<n;j++){
for(k=0;k<n;k++){
w[k]=(a[j][k]).ToString();
}
dataGridView1->Rows->Add(w);
}
for(j=0;j<16;j++)w[j]=L"";
dataGridView1->Rows->Add(w);
s++;
if(s==1000)return;
}
}
}
}
};
}







第19講第1話へ 第19講第3話へ



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