第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;の意味は、リスト候補数が1になると入力順構築関数の分析を得ずに、
通し番号=入力順番号が割り振られますので、入力順構築関数に入ってくる場合には、
リスト候補数の最小値は2以上であることが確定してしまうのです。

chs=chs+1;の意味は明らかです。chsは入力順番号=通し番号だからです。
では、

                                 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);bubunkouzoukaiseki(g);の効果を打ち消す役割をもっているのに対応しています。

                                                                 




第3話へ 第5話へ


戻る

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