第33講 数独(ナンバープレイス)問題解決ソフトVer.4の制作
(数独(ナンバープレイス)問題作成ソフトに挑戦する人は☆☆)

第6話 
Ver.7コード解説その4=部分構造解析行部分解説その1

1 4
3 9 6
5
6 7 3
1 4 8
2 3 6
5
4 8

今日は

の解析すなわち行の解析


                                 for(i=0;i<9;i++){

                                         if(a[i][y]==0){

                                                 h1[g][i]=0;

                                                 if(lst[i][y][a[x][y]-1]==0){

                                                         lst[i][y][a[x][y]-1]=1;

                                                         b[i][y]--;

                                                         h1[g][i]=1;

                                                         if(b[i][y]==1){

                                                                 iz[chs]=i;

                                                                 jz[chs]=y;

                                                                 chs++;

                                                         }

                                                         if(b[i][y]>0){

                                                                 for(j=0;j<b[i][y];j++){

                                                                         if(rlst[i][y][j]==a[x][y]){

                                                                                 w=rlst[i][y][b[i][y]];

                                                                                 rlst[i][y][b[i][y]]=a[x][y];

                                                                                 rlst[i][y][j]=w;

                                                                                 break;

                                                                         }

                                                                 }

                                                         }

                                                }

                                         }

                                 }
についてみていきましょう。
1行目
                                 for(i=0;i<9;i++){
は基本的に行の対象セルは9つあるからです。

もちろん、この例のおいては

6 7 3

6,7,3のセルは部分構造解析の対象ではありません。
しかし、普遍的な問題解決ソフトですから、
a[y][x]のセル

7

を除く行全体を対象にすべきです。



そして、

2行目
                                         if(a[i][y]==0){

の役割が現在入力されていないセルだけを対象にするためにあります。
今回の例では、6,7,8を対象外にします。代入関数

                         void dainyuu(array<String^,2>^ w){ 

                                int i,j;

                                char k1=0,k2;                              

                                for(i=0;i<13;i++){

                                        if(i%4==0)k1++;

                                        if(i%4!=0){

                                                k2=0;

                                                for(j=0;j<13;j++){

                                                        if(j%4==0)k2++;

                                                        if(j%4!=0){

                                                                if(w[i,j]!=L"")a[i-k1][j-k2]=char::Parse(w[i,j]);

                                                                if(w[i,j]==L""){

                                                                        a[i-k1][j-k2]=0;

                                                                        hs++;

                                                                }

                                                        }

                                                }

                                        }

                                }                               

                             }
見ればお分かりのように空欄のときa[i][j]の値は0になるようになっていました。
ですから、
                                         if(a[i][y]==0){

によって、

6 7 3

の黄色のセルのみが解析対象にされます。
前話最後に注意した主体セル(対象にされているセル)と客体セル(現在非対象のセル)
の関係に留意して下さい。

部分構造解析行部分にとっては、黄色のセルこそが主体セル=解析対象セルです。

さて、3行目の

                                                 h1[g][i]=0;
の役割は何でしょうか。



第5話へ 第7話へ


戻る

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