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

第12話 
普遍完成版
ついに8次もクリアして、20次以下についてはすべて作成可能な普遍版が完成しました。

コード
#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){
              label2->Text=L"TextBoxには
3以上20以下の整数\r\nを入力し再度実行ボタンを\r\n押して下さい。";
              h=0;
            }
            if(h==1){
              if(nn==3 || nn==4 || nn%2==1)n=nn;
              if(nn%4==2
|| nn==8)n=nn/2;
              if(nn!=4 && nn%4==0)n=nn/4;
              if(nn==18)n=nn/2;
            }
                  ・
                  ・
                  ・

            if(h==1 && (nn==6 ||
nn==8 || nn==10 || nn==12 || nn==14 || nn==16 || nn==20)){
                  ・
                  ・
                  ・
            }
         }
                  ・
                  ・
                  ・
解説
今回いじったのは
            if(nn<3 || nn>20){
              label2->Text=L"TextBoxには
3以上20以下の整数\r\nを入力し再度実行ボタンを\r\n押して下さい。";
              h=0;
            }
            if(h==1){
              if(nn==3 || nn==4 || nn%2==1)n=nn;
              if(nn%4==2
|| nn==8)n=nn/2;
                     ・
                     ・
                     ・
            if(h==1 && (nn==6 || nn==8 || nn==10 || nn==12 || nn==14 || nn==16 || nn==20)){
紺色の部分のみです。
つまり、本質的には前話で出来ていたのです。
8次は一番最初に加えようとしてうまくいかず、最後になってしまいました。
原因は、実は解明できていませんが、他をいじっているうちにいつの間にか問題が解消してしいたようです。
いったい何が問題だったんでしょうか。
???です。

8次を作る手順は、
if(nn%4==2 || nn==8)n=nn/2;
            →
            if(h==1 && (nn==6 || nn==8 || nn==10 || nn==12 || nn==14 || nn==16 || nn==20)){
              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);
            }
            →f1(0)→f2(0)
です。f2の
          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==100)return;
                }
ピンク
の部分は今回まったくいじっていません。
ピンクは、6,8,10,14を処理するためのものです。

今回は、気持ちの悪い終わり方で申し訳ありませんが、
20次まですべて出来るようになったと言うことで、細胞構成法の普遍化という課題はいったん終了させていただきます。
30次まで拡張すると前に申しておきましたが、その課題については後に講を設けて応えたいと思います。

第30講では、いよいよ数独問題作成ソフト制作にむけて、数独問題解決ソフトの制作に挑戦します。

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

第11話へ 第30講第1話へ

戻る

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