第24講 数独解答作成の作成
第5話 16次数独解答例

デザイン
図1

コード
#pragma once
#include<stdlib.h>
int n;
int a[16][16];
int x[256],y[256];

int s;
namespace 16次数独解答作成 {
      ・
      ・
      ・
#pragma endregion
  private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
          DateTime^ hj=DateTime::Now;
          n=16;
          s=0;
          g(n);
          f(0);
          array<String^>^ w=gcnew array<String^>(22);
          w[16]=L"数";w[17]=L"独";w[18]=L"総";w[19]=L"数";w[20]=L":";w[21]=s.ToString();

          
dataGridView1->Rows->Add(w);
          DateTime^ ow=DateTime::Now;
          TimeSpan sa=ow->Subtract(*hj);
          w[16]=L"時";w[17]=L"間";w[18]=L"計";w[19]=L"則";w[20]=L":";w[21]=(sa.TotalSeconds).ToString();
          dataGridView1->Rows->Add(w);
        }
        void g(int n){
          int i;
          for(i=0;i<n*n;i++){
            x[i]=i%n;
            y[i]=i/n;
          }
        }
        void f(int g){
           if(s==100)return;
           int i,j,k,h,kk,kkk,xs,ys;
           array<String^>^ w=gcnew array<String^>(22);

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

           for(i=0;i<n;i++){
             kkk=(kk+i)%n+1;
             a[y[g]][x[g]]=kkk;
             //a[y[g]][x[g]]=i+1;
             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]/4;
               ys=y[g]/4;
               for(j=0;j<=y[g]-4*ys;j++){
                  for(k=0;k<4;k++){

                    
if(j==y[g])if(k==x[g])break;
                    if((y[g]!=4*ys+j) && (x[g]!=4*xs+k)){
                    if(a[y[g]][x[g]]==a[4*ys+j][4*xs+k]){

                      h=0;
                      break;
                    }
                  }
               }
               if(h==0)break;
             }
           }

           int l;
           if(h==1){
             if(g<n*n-1){
               f(g+1);
             }
             else{
               for(j=0;j<n;j++){
                 if(j%4==0){
                   for(k=0;k<21;k++)w[k]=L"*";

                   dataGridView1->Rows->Add(w);
                 }
                 l=0;
                 for(k=0;k<n;k++){
                   if(k%4==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<20;k++)w[k]=L"*";
              dataGridView1->Rows->Add(w);
              for(j=0;j<21;j++)w[j]=L"";
              dataGridView1->Rows->Add(w);
              s++;
              if(s==100)return;
            }
          }
        }
      }

  };
}

ピンクは変更のあった場所)

9次においては、容量節約のためchar型も使われていましたが、すべてint型に変更してあります。
理由は、16×16=256でchar型の制限126を超えているためです。
(可能である場合は、char型を使った方が計算速度が格段に速くなります。)
ダウンロード用ファイルForm15.h


実行画面
図2

図3

では、皆さん課題です。
9次と16次の数独解答作成ソフトのそれぞれをBackgroundWorkeを用いて、
マルチスレッド化してください。
マルチスレッド数は4としてください。
手順については、第22講 素数探索を題材としたマルチスレッドプログラミングの学習☆☆
第2話 素数探索プログラミングのヒント第3話 素数探索シングルスレッド解答例を熟読して下さい。



第24講第4話へ 第24講第6話へ

戻る

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