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

第4話 
普遍暫定版のコード例
今話では、素数でない奇数次の解説の予定でしたが、暫定版が出来たのでそのコード例を示します。
本当は、完成版をアップしたかったのですが、暫定版でもかなり苦戦しました。
3時間ぐらいかけてやっと成功です。
前にVBA版で作ったのですが、そのときの自分が天才に思えてしまいました。
完成版は、途半ばです。
#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(n<3 || n>30 || (n%4==0 && n>4) || n==18){
              label2->Text=L"TextBoxには3以上30以下で8,12,16,18,20以外の整数\r\nを入力し再度実行ボタンを\r\n押して下さい。";
              h=0;
            }
            if(h==1 && (n==3 || n==4)){
              s=0;
              cn=0;
              gkh=0;
              syokika();
              if(n==3)g1(n);
              if(n==4)g2(n);
              f1(0);
              array<String^>^ w=gcnew array<String^>(31);
              int i;
              w[25]=n.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);
            }

            if(h==1 && n!=3 && n%2==1){
              gkh=0;
              s=0;
              cn=0;
              hh=sh();
              if(hh==0){
                kf1(0);
                array<String^>^ w=gcnew array<String^>(31);
                int i;
                w[25]=n.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);
              }

              if(hh==1){
                s=0;
                cn=0;
                if(n%2==1)g1(n);
                if(n%2==0)g2(n);
                syokika();
                f0(0);
                array<String^>^ w=gcnew array<String^>(31);
                int i;
                w[25]=n.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);
              }
            }

            if(h==1 && n>4 && n%2==0){
              gkh=1;
              kz=0;
              n=n/2;
              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]=(2*n).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 f00(int g){
                   ・
                   ・
                   ・
            if(h==1){
              if(g+1<n){
                f00(g+1);
              }
              else{
                for(j=1;j<n;j++){  
                  for(k=0;k<n;k++){
                    l=(3*j+k)%n;
                    a2[j][l]=a2[0][k];
                  }
                }
                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];
                        }
                      }
                    }
                  }
                  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);
                }
                if(gkh==0){
                  for(j=0;j<n;j++){
                    for(k=0;k<n;k++){
                      mah[j][k]=n*a1[j][k]+a2[j][k]+1;
                    }
                  }
                  array<String^>^ w=gcnew array<String^>(30);
                  for(j=0;j<n;j++){
                    for(k=0;k<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==100)return;
              }
            }
          }
                  ・
                  ・
                  ・
          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)f1(0);
                   if(n==4 && gkh==1)f1(0);
                 }
               }
             }
          }
          void f2(int g){
                  ・
                  ・
                  ・
            if(g<n*n-1){
              f2(g+1);
            }
            else{
              if(n!=3 && 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];
                      }
                    }
                  }
                }
                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==100)return;
              }
              if(n!=3 && n!=4 && gkh==0){
                for(j=0;j<n;j++){
                  for(k=0;k<n;k++){
                    mah[j][k]=n*a1[j][k]+a2[j][k]+1;
                  }
                }
                array<String^>^ w=gcnew array<String^>(30);
                for(j=0;j<n;j++){
                  for(k=0;k<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==100)return;
              }
              if(n==3 && gkh==0){
                for(j=0;j<n;j++){
                  for(k=0;k<n;k++){
                    mah[j][k]=n*a1[j][k]+a2[j][k]+1;
                  }
                }
                array<String^>^ w=gcnew array<String^>(30);
                for(j=0;j<n;j++){
                  for(k=0;k<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==100)return;
              }
              if(n==4 && gkh==0){
                for(j=0;j<n;j++){
                  for(k=0;k<n;k++){
                    mah[j][k]=n*a1[j][k]+a2[j][k]+1;
                  }
                }
                array<String^>^ w=gcnew array<String^>(30);
                for(j=0;j<n;j++){
                  for(k=0;k<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==100)return;
              }
              if(n==3 && 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];
                      }
                    }
                  }
                }
                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==100)return;
              } 
                   ・
                   ・
                   ・

ダウンロード用参考ファイルForm1.h
前話のコードと今話のコードで頭が混線している方、次回から丁寧に説明していきますから大丈夫ですよ。


第3話へ
第5話へ

戻る

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