第29講 細胞構成法による魔方陣の作成の普遍化△

第7話 
普遍暫定版2
暫定版を改良し、12次,16次でもできるように改良しました。
実は、2011/10/15(日)にアップ予定でしたが、ものすごく難航しました。
1日かけてもうまくいかず、原因の究明に成功したのが2011/10/17(火)でした。
それで今日やっとアップできます。
18次20次についてはすぐにもアップ可能だと思われますが、
8次についてはどういう訳かうまくいきません。
実行して6次あたりを作らせてからやるとうまくいくのですが、
実行してすぐに8次を作らせようとすると、うまくいきません。
原因を解明することに成功次第アップする予定です。
これらをクリアすると、3以上20以下のすべての整数次について出来るようになることになります。
普遍版になります。
さらに、改良して30次まではもっていく予定です。

難解なコードで申し訳ありません。
第8話以降で詳しく説明しますので、お待ちください。
尚、コードには不要な部分・意味のない部分・無駄な部分もありますが、
プログラムを組んだ私がまだ完全に消化していませんので、
すっきりしたものになるまで少し時間をいただければと思います。
入門
コード
#pragma once
#include<stdlib.h>
#include<math.h>
int n,nn;
int a1[30][30],a2[30][30],a3[30][30],mah[30][30],a4[30][30],mah1[30][30],p[30][30],cn1[30],cn2[30];
int x[400],y[400],xx[400],yy[400];
int s;
char sbr[24][2][2];
char sb[2][2];
char sx[4],sy[4];
char cn;
char gkh;
namespace sbk1 {
        ・
        ・
        ・

#pragma endregion
   private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
            label2->Text=L"";
            DateTime^ hj=DateTime::Now;
            n=int::Parse(textBox1->Text);
            char h=1,hh;
            
if(nn<3 || nn>=20 || nn==8 || nn==18){
              label2->Text=L"TextBoxには3以上20未満で8,18以外の整数\r\nを入力し再度実行ボタンを\r\n押して下さい。";

              h=0;
            }

            
if(h==1){
              if(nn==3 || nn==4 || nn%2==1)n=nn;
              if(nn%4==2)n=nn/2;
              if(nn!=4 && nn%4==0)n=nn/4;
            }

                  ・
                  ・
                  ・

            if(h==1 &&
n!=3 && n%2==1 && nn!=10 && nn!=12 && nn!=14 && nn!=18){
                  ・
                  ・
                  ・

            if(h==1 &&
(nn==6 || nn==10 || nn==12 || nn==14 || nn==16)){
              gkh=1;
              s=0;
              cn=0;
              syokika();
              if(n%2==1)g1(n);
              if(n%2==0)g2(n);
              zhy();
              sbs(0);
              sbg(0);
              array<String^>^ w=gcnew array<String^>(31);
              int i;
              w[25]=nn.ToString();w[26]=L"次";w[27]=L"魔";w[28]=L"方";w[29]=L"陣";w[30]=s.ToString();
              for(i=0;i<25;i++)w[i]=L"";
              dataGridView1->Rows->Add(w);
              DateTime^ ow=DateTime::Now;
              TimeSpan sa=ow->Subtract(*hj);
              w[25]=L"時";w[26]=L"間";w[27]=L"計";w[28]=L"則";w[29]=L":";w[30]=(sa.TotalSeconds).ToString();
              for(i=0;i<25;i++)w[i]=L"";
              dataGridView1->Rows->Add(w);
            }
          }
                ・
                ・
                ・

          
void g21(int n){
            int i,j,m;
            m=n/2;
            for(i=0;i<n*n;i++){
              if(i<n){
                xx[i]=i;
                yy[i]=i;
              }
              if(i>=n && i<2*n){
                xx[i]=2*n-i-1;
                yy[i]=i-n;
              }
              for(j=1;j<m+1;j++){
                if((i>=2*n*j-j*j-j+2) && (i<2*n*j+n-j*j-2*j+1)){
                  yy[i]=j-1;
                  xx[i]=i-(2*n*j-j*j-j+2)+j;
                  if(xx[i]>=n-yy[i]-1)xx[i]++;
                }
              }
              for(j=1;j<m+1;j++){
                if((i>=2*n*j+n-j*j-2*j+1) && (i<2*n*j+2*n-j*j-3*j)){
                  xx[i]=j-1;
                  yy[i]=i-(2*n*j+n-j*j-2*j+1)+j;
                  if(xx[i]>=n-yy[i]-1)yy[i]++;
                }
              }
              for(j=1;j<m;j++){
                if((i>=3*m*m+m+(j-1)*(n-j)) && (i<3*m*m+j*(n-j))){
                  yy[i]=j+m-1;
                  xx[i]=i-(3*m*m+m+(j-1)*(n-j))+j+m;
                }
              }
              for(j=2;j<m+1;j++){
                if((i>=3*m*m+(j-1)*(n-(j-1))) && (i<3*m*m+m+(j-1)*(n-j))){
                  xx[i]=j+m-2;
                  yy[i]=i-(3*m*m+(j-1)*(n-(j-1)))+j+m-1;
                }
              }
            }       
          }  


          
void sbg(int g){
                  ・
                  ・
                  ・

             if(h==1){
               if(g+1<n*n){
                 sbg(g+1);
               }
               else{
                 if(n!=3 && (n!=4 || gkh==0))f0(0);
                   if(n!=3 && (n!=4 || gkh==0))f0(0);
                   if(n==3)f1(0);
                   if(n==4 && gkh==1)f1(0);
                 }
               }
             }
           }
           void sbg1(int g){
             if(s==1)return;
             int i,j,k,h,w,ii,iii,l,o;
             ii=rand()%24;
             for(i=0;i<24;i++){
               iii=(ii+i)%24;
               for(j=0;j<2;j++){
                 for(k=0;k<2;k++){
                   a4[2*yy[g]+j][2*xx[g]+k]=sbr[iii][j][k];
                 }
               }
               h=1;

               if(g==n-1){
                 w=0;
                 for(j=0;j<2*n;j++){
                   w+=a4[j][j];
                 }
                 if(w!=5*n)h=0;
               }
               if(h==1){
                 if(xx[g]==0 && yy[g]==n-1){
                   w=0;
                   for(j=0;j<2*n;j++){
                     w+=a4[j][2*n-1-j];
                   }
                   if(w!=5*n)h=0;
                 }
               }

               if(h==1){
                 if(yy[g]==0 && xx[g]==n-2){
                 for(j=0;j<2;j++){
                   w=0;
                   for(k=0;k<2*n;k++){
                     w+=a4[2*yy[g]+j][k];
                   }
                   if(w!=5*n){
                     h=0;
                     break;
                   }
                 }
               }
             }

             if(h==1){
               if(xx[g]==0 && yy[g]==n-2){
                 for(j=0;j<2;j++){
                   w=0;
                   for(k=0;k<2*n;k++){
                     w+=a4[k][2*xx[g]+j];
                   }
                   if(w!=5*n){
                     h=0;
                     break;
                   }
                 }
               }
             }

             if(h==1){
               if(g>2*n-2 && xx[g]==n-1){
                 for(j=0;j<2;j++){
                   w=0;
                   for(k=0;k<2*n;k++){
                     w+=a4[2*yy[g]+j][k];
                   }
                   if(w!=5*n){
                     h=0;
                     break;
                   }
                 }
               }
             }

             if(h==1){
               if(g>2*n+1 && yy[g]==n-1){
                 for(j=0;j<2;j++){
                   w=0;
                   for(k=0;k<2*n;k++){
                     w+=a4[k][2*xx[g]+j];
                   }
                   if(w!=5*n){
                     h=0;
                     break;
                   }
                 }
               }
             }

             if(h==1){
               if(g==n*n-2){
                 for(j=0;j<2;j++){
                   w=0;
                   for(k=0;k<2*n;k++){
                     w+=a4[k][2*xx[g]+j];
                   }
                   if(w!=5*n){
                     h=0;
                     break;
                   }
                 }
               }
             }
             if(h==1){
               if(g==n*n-1){
                 for(j=0;j<2;j++){
                   w=0;
                   for(k=0;k<2*n;k++){
                     w+=a4[2*yy[g]+j][k];
                   }
                   if(w!=5*n){
                      h=0;
                      break;
                    }
                  }
                }
              }

              if(h==1){
                if(g+1<n*n){
                  sbg1(g+1);
                }
                else{
                  for(j=0;j<n;j++){
                    for(k=0;k<n;k++){
                      for(l=0;l<2;l++){
                        for(o=0;o<2;o++){
                          mah1[2*j+l][2*k+o]=4*(mah[j][k]-1)+a4[2*j+l][2*k+o];
                        }
                      }
                    }
                  }
                  array<String^>^ w=gcnew array<String^>(30);
                  for(j=0;j<2*n;j++){
                    for(k=0;k<2*n;k++){
                      w[k]=(mah1[j][k]).ToString();
                    }
                    dataGridView1->Rows->Add(w);
                  }
                  for(j=0;j<30;j++)w[j]=L"";
                  dataGridView1->Rows->Add(w);
                  s++;
                  if(s==1)return;
                }
              }
            }
          }

                   ・
                   ・
                   ・
          void f2(int g){
                  ・
                  ・
                  ・
            if(g<n*n-1){
              f2(g+1);
            }
            else{
              if(gkh==1){
                for(j=0;j<n;j++){
                  for(k=0;k<n;k++){
                    for(l=0;l<2;l++){
                      for(o=0;o<2;o++){
                        mah[2*j+l][2*k+o]=4*(n*a1[j][k]+a2[j][k])+a3[2*j+l][2*k+o];
                      }
                    }
                  }
                }
                if(nn!=12 && nn!=16){
                  array<String^>^ w=gcnew array<String^>(30);
                  for(j=0;j<2*n;j++){
                    for(k=0;k<2*n;k++){
                      w[k]=(mah[j][k]).ToString();
                    }
                    dataGridView1->Rows->Add(w);
                  }
                  for(j=0;j<30;j++)w[j]=L"";
                  dataGridView1->Rows->Add(w);
                  s++;
                  if(s==1)return;
                }                
                
if(nn==12 || nn==16){
                  n=nn/2;
                  if(nn==12)for(j=0;j<1;j++)rand();
                  if(nn==16)for(j=0;j<1;j++)rand();
                  if(nn==20)for(j=0;j<8;j++)rand();
                  g21(n);
                  sbg1(0);
                }

              }
                   ・
                   ・
                   ・

ダウンロード用参考ファイルForm1.h






第6話へ
第8話へ

戻る

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