第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
これで1個目の順列方陣が完成しますが、完成とともに空間識別番号3の世界のループが終わり、
1回目の次元世界3は自分の寿命を迎え、消滅します。
次元世界2は、4巡目のループとなり、
となりますが、これも検査
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);
}
の肯定部分が実行され、空間識別番号3の世界の2回目の生誕となります。
for(i=1;i<5;i++){
sb[sy[g]][sx[g]]=i;
のループが再開されます。
再開といいましたが、空間識別番号3の世界は、自分が2回目の生であることはもちろん知りませんから、
空間識別番号3の世界にとっては、はじめてのループであると思っています。
世界の消滅は、世界の痕跡さえ残しません。ですから、グローバル配列char sbr[24][2][2];が必要なわけです。
ここに記録しておかなければ、コンピュータの労働は無駄になってしまいます。
2回目のループの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巡目となり、
重複検査
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巡目となります。
これは、重複検査
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];に記録されます。
その直後に
となりますが、重複試験
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++;
}
}
は実施されず、次元世界3の世界の2回目の天寿を全うします。
天寿を全うしたというには、2個目の順列方陣
という成果を残しているからです。2回目の次元世界3の任務はこれを見つけることにあったからです。
第5話へ 第7話へ
VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual
Basic入門基礎講座