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

第9話 
普遍暫定版3
20次を加えました。
これで、20以下で出来ないのは、8次と18次のみとなりました。
コード
#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 && nn!=20){
                  ・
                  ・
                  ・

            if(h==1 && (
nn==6 || nn==10 || nn==12 || nn==14 || nn==16 || nn==20)){
                  ・
                  ・
                  ・

         }
                  ・
                  ・
                  ・

         void sbg1(int g){
                  ・
                  ・
                  ・
             if(h==1){
               if(
xx[g]>0 && xx[g]<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;
                   }
                 }
               }
             }
                  ・
                  ・
                  ・
         }
                  ・
                  ・
                  ・
         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];
                         }
                       }
                     }
                   }
                   
if(nn!=20){
                     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==20){
                     n=nn/2;
                     if(nn==20)for(j=0;j<5;j++)rand();
                     g21(n);
                     sbg1(0);
                   }

                 }
                        ・
                        ・
                        ・
         }


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

解説
今回の一番の改良点は
             if(h==1){
               if(
xx[g]>0 && xx[g]<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>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(g>2*n+1 && yy[g]==n-1)とif(
xx[g]>0 && xx[g]<n-1 && yy[g]==n-1)では同じはずなのですが、
なぜか前者ではうまくいきません。ごめんなさい。原因はわかりません。
もう一つの変更点は、
                   if(nn!=20){
                     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==20){
                     n=nn/2;
                     if(nn==20)for(j=0;j<5;j++)rand();
                     g21(n);
                     sbg1(0);
                   }

                 }
です。
                   
if(nn!=20){
                     ・
                  
 }
を入れないと、10次でデータグリッドビューに結果を表示してしまいます。
                  
if(nn==20){
                     n=nn/2;
                     if(nn==20)for(j=0;j<5;j++)rand();
                     g21(n);
                     sbg1(0);
                   }

はsbg1でさらなる倍加を図ります。


第8話へ
第10話へ

戻る

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