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


第3話 
入力順の決定を1つのセルにする方法

       void nyuryokujyunkoutiku(char g){
          char i,j,k,h,jh,ih;
          char min=100;
          k=0;
          for(i=0;i<9;i++){
            for(j=0;j<9;j++){
              if(a[i][j]==0){
                h=1;
                if(g>0){
                  for(k=0;k<g;k++){
                     if(j==zx[k] && i==zy[k]){     
                      h=0;
                      break;
                    }
                  }
                }
                if(h==1){
                  if(b[i][j]<min){
                    min=b[i][j];
                    ih=i;
                    jh=j;
                  }
                }
              }
            } 
          }
          zx[g]=jh;
          zy[g]=ih;
        }
      }
               ・
               ・
               ・
      void f(char g){
        if(s==2)return;

               ・
               ・
               ・
          if(h==1){
             a[y][x]=rlst[y][x][iii];
             if(g+1<81){
               nyuryokujyunkoutiku(g+1);
               f(g+1);
             }
               ・
               ・
               ・
これが正解です。しかし、これだと
c++
は18秒で解けていたのに1分ぐらいかかるようになってしまいました。
しかし、ちょっとした完全を付け加えるだけで、0.95秒で解けるようになります。
ヒントは、全体構造解析を最初のみ行っていましたが、
セルに数字を入れる度に構造が変わります。
ですから最初のみの構造解析ではなく、毎回行えばよいのです。

ただし、
    void f(char g){
      if(s==2)return;
      char x,y,xa,xs,ya,ys;
      x=zx[g];
      y=zy[g];
      xa=x%3;
      xs=x/3;
      ya=y%3;
      ys=y/3;
      char h,i,j,k,k1,k2,ii,iii;
      if(a[y][x]>0){
         if(g+1<81){
         f(g+1);
      }
      else{
        k1=0;
        for(i=0;i<13;i++){
          if(i%4==0){
            k1++;
            for(j=0;j<13;j++)dataGridView1[j,i+14]->Value=L"*";    
          }
          if(i%4>0){
            k2=0;
            for(j=0;j<13;j++){
              if(j%4==0){
                dataGridView1[j,i+14]->Value=L"*";
                k2++;
              }
              if(j%4>0){
                dataGridView1[j,i+14]->Value=a[i-k1][j-k2];
              } 
            }
          }
        }
        s++;
        if(s==2)return;
      }
    }
    if(a[y][x]==0){
       ii=rand()%b[y][x];
       for(i=0;i<b[y][x];i++){
               ・
               ・
               ・
ii=rand()%b[y][x];は改善が必要です。セルに数字が埋まっていく間にb[y][x]=0となることがあり得るからです。
さて、皆さん改良を試みましょう。



第2話へ 第4話へ


戻る

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