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

第6話 細胞の作成の解説その4

コード例

               ・
               ・
        //細胞の作成関数
        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++;
               }
             }
           }
         }

              ・
              ・
解説の続きトレースその3

  0  1 
  0  1 

これで1個目の順列方陣が完成しますが、完成とともに空間識別番号の世界のループが終わり、
1回目の次元世界
は自分の寿命を迎え、消滅します。

  0  1 
  0  1 

次元世界2は、4巡目のループとなり、

  0  1 
  0  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);
               }

の肯定部分が実行され、空間識別番号
の世界の2回目の生誕となります。

  0  1 
  0  1 

          for(i=1;i<5;i++){
             sb[sy[g]][sx[g]]=
i;
のループが再開されます。
再開といいましたが、空間識別番号の世界は、自分が2回目の生であることはもちろん知りませんから、
空間識別番号3の世界にとっては、はじめてのループであると思っています。
世界の消滅は、世界の痕跡さえ残しません。ですから、グローバル配列char sbr[24][2][2];が必要なわけです。
ここに記録しておかなければ、コンピュータの労働は無駄になってしまいます。
2回目のループの1巡目において、

  0  1 
  0  1 

となりますが、これは早速試験
             if(g>0){
               for(j=0;j<g;j++){
                 if(sb[sy[g]][sx[g]]==sb[sy[j]][sx[j]])h=0;
               }
             }

の1巡目ループにおいて抵触し、2回目ループの2巡目となり、

  0  1 
  0  1 

重複検査
             if(g>0){
               for(j=0;j<g;j++){
                 if(sb[sy[g]][sx[g]]==sb[sy[j]][sx[j]])h=0;
               }
             }

の2巡目ループにおいて、h=0とされ、即座に2回目ループの3巡目となります。

  0  1 
  0  1 

これは、重複検査
             if(g>0){
               for(j=0;j<g;j++){
                 if(sb[sy[g]][sx[g]]==sb[sy[j]][sx[j]])h=0;
               }
             }

をすべてクリアして、2個目の順列方陣が完成し、グローバル配列char sbr[24][2][2];に記録されます。
その直後に

  0  1 
  0  1 

となりますが、重複試験
             if(g>0){
               for(j=0;j<g;j++){
                 if(sb[sy[g]][sx[g]]==sb[sy[j]][sx[j]])h=0;
               }
             }

の4巡目において、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++;
               }
             }

は実施されず、次元世界
の世界の2回目の天寿を全うします。
天寿を全うしたというには、2個目の順列方陣

  0  1 

という成果を残しているからです。2回目の次元世界の任務はこれを見つけることにあったからです。


第5話へ
第7話へ

戻る

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