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


第10話 列の条件(縦の条件)を加える。
行の条件に成功したのですから、列の条件は簡単そうに見えます。

例えば、次のようにコーティングすればうまくいくような気がします。
            k1=0;
            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(a[i-k1][j-k2]==0){
                       for(k=1;k<10;k++){
                         h=1;
                         if(j-k2>0){
                           for(l=0;l<j-k2;l++){
                             if(a[i-k1][l]==k){
                               h=0;
                               break;
                             }
                           }
                         }
                         if(h==1){
                           if(j-k2+1<8){
                             for(l=j-k2+1;l<9;l++){
                               if(a[i-k1][l]==k){
                                 h=0;
                                 break;
                               }
                             }
                           }
                         }
                         
if(h==1){
                           if(i-k1>0){
                             for(l=0;l<i-k1;l++){
                               if(a[l][j-k2]==k){
                                 h=0;
                                 break;
                               }
                             }
                           }
                         }
                         if(h==1){
                           if(i-k1+1<8){
                             for(l=i-k1+1;l<9;l++){
                               if(a[l][j-k2]==k){
                                 h=0;
                                 break;
                               }
                             }
                           }
                         }

                         if(h==1){
                           a[i-k1][j-k2]=k;
                           dataGridView1[j,15+i]->Value=a[i-k1][j-k2];
                         }
                       }
                     }

                    }
                  }          
                }


                         if(h==1){
                           if(i-k1>0){
                             for(l=0;l<i-k1;l++){
                               if(a[l][j-k2]==k){
                                 h=0;
                                 break;
                               }
                             }
                           }
                         }
                         if(h==1){
                           if(i-k1+1<8){
                             for(l=i-k1+1;l<9;l++){
                               if(a[l][j-k2]==k){
                                 h=0;
                                 break;
                               }
                             }
                           }
                         }

が列の条件です。
ところが実行してみると、
初心者
と空欄が出来てしまいました。これは当然です。入門は行を見ると1しか入りません。
ところが、列の条件から1はだめなのです。
実は、私もfor文版でもいけるかなと思っていたのですが、
やはりだめなのです。
再帰版の場合行き詰まったら戻ってやり直すことが出来ますが、
for文版の場合行き詰まったらおしまいです。
すべての場合を尽くしていないのです。
そこで、皆さん今回のコードを
第24講 数独解答の作成☆
 第1話 数独とは?
 第2話 数独解答ソフト解答例
 第3話 ブロック境界線解答例
 第4話 ブロック重複判定部分解説
を参考に作り直しましょう。




第9話へ 第11話へ

戻る

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