第20講 一般種法による魔方陣ソフトの高速化
第6話 番号付け解答例


番号付けを表示するソフト例を示します。これをさらに改良して、一般種法による魔方陣作成ソフトを作ります。
まず、デザインをのように変更してください。
そして、コードを次のように変更してください。
#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);
          */
          int i;
          for(i=3;i<11;i++){
            if(i%2==1)g1(i);
            if(i%2==0)g2(i);
          }
          /*
          inti,j;
          for(i=0;i<n;i++){
            for(j=0;j<n;j++){
              p[i][j]=0;
            }
          }
          f1(0);
          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,j,m;
          m=n/2;
          for(i=0;i<n*n;i++){
            if(i<n){
              x[i]=i;
              y[i]=i;
            }
            if(i>=n && i<2*n-1){
              x[i]=2*n-i-1;
              y[i]=i-n;
              if(x[i]<=y[i]){
                 x[i]--;
                 y[i]++;
              }
            }
            for(j=1;j<m+1;j++){
              if((i>=2*n-1+(2*n-j-2)*(j-1)) && (i<3*n-3+(2*n-j-3)*(j-1))){
                y[i]=j-1;
                x[i]=i-(2*n-1+(2*n-j-2)*(j-1))+j;
                if(x[i]>=n-y[i]-1)x[i]++;
              }
            }
            for(j=1;j<m+1;j++){
              if((i>=3*n-3+(2*n-3-j)*(j-1)) && (i<2*n-1+(2*n-3-j)*j)){
                x[i]=j-1;
                y[i]=i-(3*n-3+(2*n-3-j)*(j-1))+j;
                if(x[i]>=n-y[i]-1)y[i]++;
              }
            }
            for(j=1;j<m+1;j++){
              if((i>=3*n-3+m+(2*n-m-3)*(m-1)+(2*m+2-j)*(j-1)) && (i<3*n-3+2*m+(2*n-m-3)*(m-1)+(2*m+1-j)*(j-1))){
                y[i]=j+m-1;
                x[i]=i-(3*n-3+m+(2*n-m-3)*(m-1)+(2*m+2-j)*(j-1))+j+m;
              }
            }
            for(j=1;j<m+1;j++){
              if((i>=3*n-3+2*m+(2*n-m-3)*(m-1)+(2*m+1-j)*(j-1)) && (i<3*n-3+m+(2*n-m-3)*(m-1)+(2*m+1-j)*j)){
                x[i]=j+m-1;
                y[i]=i-(3*n-3+2*m+(2*n-m-3)*(m-1)+(2*m+1-j)*(j-1))+j+m;
              }
            }
         }
         array<String^>^ w=gcnew array<String^>(16);
         for(i=0;i<n*n;i++){
           a1[y[i]][x[i]]=i;
         }
         for(i=0;i<n;i++){
           for(j=0;j<n;j++){
             w[j]=a1[i][j].ToString();
           }
           dataGridView1->Rows->Add(w);
         }
         for(i=0;i<15;i++){
           w[i]=L"";
         }
         dataGridView1->Rows->Add(w);

       }
       void g2(char n){
         char i,j,m;
         m=n/2;
         for(i=0;i<n*n;i++){
           if(i<n){
             x[i]=i;
             y[i]=i;
           }
           if(i>=n && i<2*n){
             x[i]=2*n-i-1;
             y[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)){
               y[i]=j-1;
               x[i]=i-(2*n*j-j*j-j+2)+j;
               if(x[i]>=n-y[i]-1)x[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)){
                x[i]=j-1;
                y[i]=i-(2*n*j+n-j*j-2*j+1)+j;
                if(x[i]>=n-y[i]-1)y[i]++;
             }
           }
           for(j=1;j<m;j++){
             if((i>=3*m*m+m+(j-1)*(n-j)) && (i<3*m*m+j*(n-j))){
               y[i]=j+m-1;
               x[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))){
               x[i]=j+m-2;
               y[i]=i-(3*m*m+(j-1)*(n-(j-1)))+j+m-1;
             }
           }
         }
         
array<String^>^ w=gcnew array<String^>(16);
         for(i=0;i<n*n;i++){
           a1[y[i]][x[i]]=i;
         }
         for(i=0;i<n;i++){
           for(j=0;j<n;j++){
             w[j]=a1[i][j].ToString();
           }
           dataGridView1->Rows->Add(w);
         }
         for(i=0;i<15;i++){
           w[i]=L"";
         }
         dataGridView1->Rows->Add(w);

       }

            ・
            ・
            ・

ダウンロード用Form1.hファイル
コピペを行う場合にはダウンロードファイルを開き、必要部分をコピーして、ペースしてください。
2話から5話を読み飛ばされた方は、
Form1.hファイルからコピペを行うか、該当フォルダにForm1.hファイルを上書きして下さい。

あるいは、次のような手順でも結構です。
まず、Form1.hファイルを開き上から下まですべて範囲指定してコピーします。
次に、VC++2010を起動し新しいプロジェクト...をクリックして、
名前に『魔方陣高速作成ソフト(名前は何でも結構です。)』と打ち込みOKします。

そして、Form1.hを右クリックしてコードの表示をクリックします。
コードが出てきたら、上から下まで範囲指定して、右クリックして貼り付けを選びます。
つまり、自動でできたコードをダウンロードファイルのコードと入れ換えればよいのです。
そうすると、From1.hがダウンロードしたものと同じになります。
最後に、
#pragma once
#include<stdlib.h>
int n;
int a1[10][10],a2[10][10],p[10][10];
int x[100],y[100];
int s;
namespace 一般種法による魔方陣作成ソフト {
一般種法による魔方陣作成ソフトの部分を魔方陣高速作成ソフト(ご自分で付けた名前)と変更して下さい。
これで私が作ったものと完全に同じものができ、ビルドできるようになります。


ビルドして実行ボタンを押すと、


のように番号付けが成功していることが分かります。

では皆さんForm1.hを改良して一般種法による魔方陣作成ソフトを完成させてください。

尚、
         array<String^>^ w=gcnew array<String^>(16);
         for(i=0;i<n*n;i++){
           a1[y[i]][x[i]]=i;
         }
         for(i=0;i<n;i++){
           for(j=0;j<n;j++){
             w[j]=a1[i][j].ToString();
           }
           dataGridView1->Rows->Add(w);
         }
         for(i=0;i<15;i++){
           w[i]=L"";
         }
         dataGridView1->Rows->Add(w);

番号付けを表示するためのものです。したがって、改良の際にはここは削除してください。


第20講第5話へ 第20講第7話へ



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