第33講 数独(ナンバープレイス)問題解決ソフトVer.4の制作
(数独(ナンバープレイス)問題作成ソフトに挑戦する人は☆☆)
第4話 Ver.7コード解説その2=入力順構築関数の解説
今話は、入力順構築について解説していきます。
void nyuuryokujyunkoutiku(char g){
register char i,j;
register char
Min,imin,jmin;
chsh[g]=0;
if(g>=chs){
Min=9;
for(i=0;i<9;i++){
for(j=0;j<9;j++){
if(a[i][j]==0){
if(b[i][j]<Min){
Min=b[i][j];
imin=i;
jmin=j;
}
}
if(Min==2)break;
}
if(Min==2)break;
}
iz[g]=imin;
jz[g]=jmin;
chs=chs+1;
chsh[g]=1;
}
}
今回の工夫された部分は、色がついています。
まず、if(Min==2)break;
前回の全体構造解析において、b[i1][i2]が1になると入力順構築関数の判断をえずに、
即座に番号付け
if(b[i1][i2]==1){
iz[chs]=i1;
jz[chs]=i2;
chs++;
}
がなされていました。chsは通し番号でこれが構築順番号になります。
1 | 4 | |||||||
3 | 9 | 6 | ||||||
5 | ||||||||
6 | 3 | |||||||
1 | 4 | 8 | ||||||
2 | 3 | 6 | ||||||
5 | ||||||||
4 | 8 |
この問題であれば、赤いセルに0の番号が割り振られることから始まり、
最終的にはchsは63まで通し番号が割り振られます。
chsは、Ver.3ではcnとなっていたものです。
if(Min==2)break;
通し番号=入力順番号が割り振られますので、入力順構築関数に入ってくる場合には、
リスト候補数の最小値は2以上であることが確定してしまうのです。
chs=chs+1;
では、
chsh[g]=0;
・
・
chsh[g]=1;
にはどういう役割が与えられているでしょうか。これは、本体関数fの
if(g+1<hs){
bubunkouzoukaiseki(g);
nyuuryokujyunkoutiku(g+1);
f(g+1);
if(chsh[g+1]==1)chs--;
gyakububunkouzoukaiseki(g);
}
のif(chsh[g+1]==1)chs--;
つまり、通し番号が全体構造解析または部分構造解析によって付けられたのではなく、
入力順構築関数nyuuryokujyunkoutikuによって付けられたときには、
g+1の世界からgの世界に戻ってきたとき、
nyuuryokujyunkoutiku(g+1);
nyuuryokujyunkoutiku(g+1);の効果をキャンセルするので最初はgyakunyuuryokujyunkoutiku(g+1)(逆入力順構築)を考えましたが、
内容がたったの1文if(chsh[g+1]==1)chs--;しかないので、関数としては独立させませんでした。
役割はnyuuryokujyunkoutiku(g+1);の効果を打ち消すものです。
gyakububunkouzoukaiseki(g);
VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual
Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)