第28講 細胞構成法による魔方陣の作成△

第8話 素数次魔方陣解答例
コード例
#pragma once
#include<stdlib.h>
int n;
int a1[20][20],a2[20][20],p[20][20],cn1[20],cn2[20];
int x[400],y[400];
int s;
char sbr[24][2][2];
char sb[2][2];
char sx[4],sy[4];
char cn;
namespace sbk {
        ・
        ・
        ・
#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);
          int h=1;
          if(n<3 || n>7 || n%2==0){
            label2->Text=L"TextBoxには3以上11以下の奇数\r\nを入力し再度実行ボタンを\r\n押して下さい。";
            h=0;
          }
          if(h==1){
            /*
            s=0;
            if(n%2==1)g1(n);
            if(n%2==0)g2(n);
            syokika();
            if(n==3 || n==4)srand(0);
            if(n==5)srand(5);
            if(n==6)srand(28);
            if(n==7)srand(31);
            if(n==8)srand(597);
            if(n==9)srand(3154);
            if(n==10)srand(1114);
            if(n==11)srand(3375);
            今回は細胞の作成がうまくいっているかどうかの確認なのでいらないところを/*と*/で囲んで注釈文に変えている。
            */
            cn=0;

            zhy(); //細胞作成用座標の作成
            sbs(0); //細胞の作成
            
/*
            int i,j,k;
            //作成した細胞の表示
            for(i=0;i<cn*3+1;i++)dataGridView1->Rows->Add();
            for(i=0;i<cn;i++){
              for(j=0;j<2;j++){
                for(k=0;k<2;k++){
                  dataGridView1[k,j+3*i]->Value =sbr[i][j][k]; //このdataGridView1の使い方については次話で解説
                }
              }
            }
            dataGridView1[0,cn*3]->Value =cn; //細胞総数の表示
            */

            
if(n!=3 )f0(0); //5次7次の場合を新設
            if(n==3)f1(0); //末項確定法の再利用
            array<String^>^ w=gcnew array<String^>(
15);
            int i;
            
w[9]=n.ToString();w[10]=L"次";w[11]=L"魔";w[12]=L"方";w[13]=L"陣";w[14]=s.ToString();
            for(i=0;i<8;i++)w[i]=L"";
            dataGridView1->Rows->Add(w);
            DateTime^ ow=DateTime::Now;
            TimeSpan sa=ow->Subtract(*hj);
            
w[9]=L"時";w[10]=L"間";w[11]=L"計";w[12]=L"則";w[13]=L":";w[14]=(sa.TotalSeconds).ToString();
            for(i=0;i<9;i++)w[i]=L"";
            dataGridView1->Rows->Add(w);
          }
        }

              ・
              ・
        
void f0(int g){
          if(s==200)return;
          int i,j,k,l,h;

          for(i=0;i<n;i++){
            a1[0][g]=i;
            h=1;
            if(g>0){
              for(j=0;j<g;j++){
                if(a1[0][g]==a1[0][j]){
                  h=0;
                  break;
                }
              }
            }
            if(h==1){
              if(g+1<n){
                f0(g+1);
              }
              else{
                for(j=1;j<n;j++){
                  for(k=0;k<n;k++){
                    l=(2*j+k)%n;
                    a1[j][l]=a1[0][k];
                  }
                }
                f00(0);
              }
            }
          }
        }
 

        void f00(int g){
          if(s==200)return;
          int i,j,k,l,h;

          for(i=0;i<n;i++){
            a2[0][g]=i;
            h=1;
            if(g>0){
            for(j=0;j<g;j++){
              if(a2[0][g]==a2[0][j]){
                h=0;
                break;
              }
            }
          }
          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];
                }
              }
              array<String^>^ w=gcnew array<String^>(15);
              for(j=0;j<n;j++){
                for(k=0;k<n;k++){
                  w[k]=(n*a1[j][k]+a2[j][k]+1).ToString();
                }
                dataGridView1->Rows->Add(w);
              }
              for(j=0;j<14;j++)w[j]=L"";
              dataGridView1->Rows->Add(w);
              s++;
              if(s==200)return;
            }
          }
        }
      }

             ・
             ・
             ・

コード解説は次話で


第7話へ
第9話へ

戻る

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

l>