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