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

第3話 細胞の作成の解説その1
コード例

#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 {
               ・
               ・
            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; //細胞総数の表示
                 ・
                 ・
          }
        }
        //細胞の座標作成関数
        void zhy(){
          char i;
          for(i=0;i<4;i++){
             sx[i]=i%2;
             sy[i]=i/2;
          }
        }
        //細胞の作成関数
        void sbs(char
g){
          char i,j,k,h;
          for(i=1;i<5;i++){
             sb[sy[g]][sx[g]]=i;
             h=1;
             if(g>0){
               for(j=0;j<g;j++){
                 if(sb[sy[g]][sx[g]]==sb[sy[j]][sx[j]])h=0;
               }
             }
             if(h==1){
               if(g+1<4){
                 sbs(g+1);
               }
               else{
                 for(j=0;j<2;j++){
                   for(k=0;k<2;k++){
                     sbr[cn][j][k]=sb[j][k];
                   }
                 }
                 cn++;
               }
             }
           }
         }

              ・
              ・
解説
今回のコードの目的は、すべての細胞を作成しそれを表示させて、うまく意図通りにいっているかの確認です。
順列方陣(細胞)の名称からわかることは、結局は1234の順列を2次元に並べているだけです。
ですから、その総数は4!=4×3×2×1=24です。
順列を並べているだけだとすれば、今回のコードは

既習済みの
第15講 関数の再帰的呼び出し☆☆
 第1話 順列の作成
 第2話 関数の再帰的利用のメリット
 第3話 for文による順列作成の解説
 第4話 関数の再帰的呼び出しによる順列作成の解説その1
 第5話 関数の再帰的呼び出しによる順列作成の解説その2
 第6話 関数の再帰的呼び出しによる順列作成の解説その3
 第7話 関数の再帰的呼び出しによる順列作成の解説その4
 第8話 DataGridViewによる順列作成ソフトの改良その1
 第9話 DataGridViewによる順列作成ソフトの改良その2
 第10話 DataGridViewによる順列作成ソフトの改良その3
が参考になります。再度熟読をお願いします。
再帰的呼び出しの解説が4話にわたり非常に長いわけですが、
トレースを粘り強く1つ1つ追いながらお読みになってください。

2次元に並べるためのミソは、
        //細胞の座標作成関数
        void zhy(){
          char i;
          for(i=0;i<4;i++){
             sx[i]=i%2;
             sy[i]=i/2;
          }
        }
にあります。これは、セル番号
0123

  0  1 

と並べるためのものです。a%bは、aをbで割った余りを求めるものでしたね。
さらに、char sx[4],sy[4];から両方とも整数型ですからi/2の計算は、小数部分が切り捨てられます。
sx[
]=%2=
sy[
]=/2=
sx[
]=%2=
sy[
]=/2=
sx[
]=%2=
sy[
]=/2=
sx[
]=%2=
sy[
]=/2=
1次元セル番号0123が見事に2次元に対応させられています。
(このサイトの特色である色対応に注意されながら読んでください。)
また、0123はvoid sbs(char g)のgに対応していていましたね。
 第4話 関数の再帰的呼び出しによる順列作成の解説その1
 第5話 関数の再帰的呼び出しによる順列作成の解説その2
 第6話 関数の再帰的呼び出しによる順列作成の解説その3
 第7話 関数の再帰的呼び出しによる順列作成の解説その4
で強調したこと、セル番号とセルに入る内容を明確に区別することをお忘れにならないでください。
セル番号は、ビール瓶のラベルに相当し、内容はビール瓶に入っているビールに相当します。
セル番号は、世界の次元番号を表すものですし、
        void sbs(char g){
          char i,j,k,h;
          for(i=1;i<5;i++){
のiは、ビールに相当します。
詳しくは次話で。

第2話へ
第4話へ

戻る

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