第24講 数独解答作成の作成
第3話 ブロック境界線解答例

#pragma once
#include<stdlib.h>
int n;
int a[10][10];
int x[100],y[100];
int s;
namespace 数独解答作成 {
         ・
         ・
         ・
#pragma endregion
  private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
          DateTime^ hj=DateTime::Now;
          n=9;
          s=0;
          g(n);
          int i;
          f(0);
          array<String^>^ w=gcnew array<String^>(10);
          w[4]=L"数";w[5]=L"独";w[6]=L"総";w[7]=L"数";w[8]=L":";w[9]=s.ToString();
          dataGridView1->Rows->Add(w);
          DateTime^ ow=DateTime::Now;
          TimeSpan sa=ow->Subtract(*hj);
          w[4]=L"時";w[5]=L"間";w[6]=L"計";w[7]=L"則";w[8]=L":";w[9]=(sa.TotalSeconds).ToString();
          dataGridView1->Rows->Add(w);
       }
       void g(char n){
          char i,j;
          for(i=0;i<n*n;i++){
            x[i]=i%n;
            y[i]=i/n;
          }
       }
       void f(char g){
         if(s==100)return;
         int i,j,k,h,kk,kkk,xs,ys;
         array<String^>^ w=gcnew array<String^>(10);

         rand();
         rand();
         kk=rand()%n;

         for(i=0;i<n;i++){
           kkk=(kk+i)%n+1;
           a[y[g]][x[g]]=kkk;
           h=1;
           if(x[g]>0){
             for(j=0;j<x[g];j++){
               if(a[y[g]][x[g]]==a[y[g]][j]){
                 h=0;
                 break;
               }
             }
           }
           if(h==1){
             if(y[g]>0){
               for(j=0;j<y[g];j++){
                 if(a[y[g]][x[g]]==a[j][x[g]]){
                    h=0;
                    break;
                 }
               }
             }
           }

           if(h==1){
             xs=x[g]/3;
             ys=y[g]/3;
             for(j=0;j<=y[g]-3*ys;j++){
               for(k=0;k<3;k++){
                 if(j==y[g])if(k==x[g])break;
                   if((y[g]!=3*ys+j) && (x[g]!=3*xs+k)){
                     if(a[y[g]][x[g]]==a[3*ys+j][3*xs+k]){
                       h=0;
                       break;
                     }
                   }
                 }
                 if(h==0)break;
              }
            }

            if(h==1){
              if(g<n*n-1){
                f(g+1);
              }
            else{
              for(j=0;j<n;j++){
                for(k=0;k<n;k++){
                  w[k]=(a[j][k]).ToString();
                }
                dataGridView1->Rows->Add(w);
              }
              for(j=0;j<10;j++)w[j]=L"";
              dataGridView1->Rows->Add(w);
              s++;
              if(s==100)return;
            }

          }
        }
     
 }

  };
}

ピンクの部分を次のように変更します。

           char l;
           if(h==1){
             if(g<n*n-1){
               f(g+1);
             }
           else{
             for(j=0;j<n;j++){
               if(j%3==0){
                 for(k=0;k<13;k++)w[k]=L"*";
                 dataGridView1->Rows->Add(w);
               }
               l=0;

               for(k=0;k<n;k++){
                 if(k%3==0){
                   w[k+l]=L"*";
                   l++;
                 }

                 w[k+l]=(a[j][k]).ToString();
               }
               w[k+l]=L"*";
               dataGridView1->Rows->Add(w);
             }
             for(k=0;k<13;k++)w[k]=L"*";
             dataGridView1->Rows->Add(w);

             for(j=0;j<13;j++)w[j]=L"";
             dataGridView1->Rows->Add(w);
             s++;
             if(s==100)return;
          }

の部分が変更ないしは加えた部分です。
もちろんデザインも

と変更しておかなければなりません。

実行画面


解説
               if(j%3==0){
                 for(k=0;k<13;k++)w[k]=L"*";
                 dataGridView1->Rows->Add(w);
               }

では、1行目、4行目、7行目に

アスタリスク(*)を入れています。
そして、
             for(k=0;k<13;k++)w[k]=L"*";
             dataGridView1->Rows->Add(w);

で10行目にアスタリスク(*)を入れています。

                 if(k%3==0){
                   w[k+l]=L"*";
                   l++;
                 }

においては、各行の1列目、4列目、7列目にアスタリスク(*)を入れています。
そして、
               w[k+l]=L"*";
で10列目にアスタリスク(*)を入れています。
                 w[k+l]=(a[j][k]).ToString();
k+lは、1列目、4列目、7列目にアスタリスク(*)が入ったので、その分をずらしています。

ブロックの重複チェックの解説は次話で行います。


第24講第2話へ 第24講第4話へ



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