最終講 卒業研究と卒業試験

第5話 課題4 ブロック線を加える 課題5 ランダムを入れて自然な数独にする

解答例
#pragma once
int a[9][9];
int x[81],y[81];

int s;
namespace 順列方陣 {

  using namespace System;  
        ・

        ・
        ・
#pragma endregion
  private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           DateTime hj=DateTime::Now;
           s=0;
           h();
           f(0);
           array<String^>^ w=gcnew array<String^>(14);
           w[8]=L"順";w[9]=L"列";w[10]=L"総";w[11]=L"数";w[12]=L":";w[13]=s.ToString();
           dataGridView1->Rows->Add(w);
           DateTime ow=DateTime::Now;
           TimeSpan sa=ow-hj;
           w[8]=L"時";w[9]=L"間";w[10]=L"計";w[11]=L"則";w[12]=L":";w[13]=(sa.TotalSeconds).ToString();
           dataGridView1->Rows->Add(w);
        }
        void h(){
           char i;
           for(i=0;i<81;i++){
             x[i]=i%9;
             y[i]=i/9;
           }
        }
        void f(char g){
           if(s==100)return;  'すべて計算させるとかなり時間がかかるので100個で止めている。
           int i,j,k,
l,xs,ys,h;
          
array<String^>^ w=gcnew array<String^>(14);
           for(i=0;i<9;i++){
             a[y[g]][x[g]]=i+1;
             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){
               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){
               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+1<81){
                  f(g+1);
                }
               else{
                  
for(j=0;j<9;j++){
                   if(j%3==0){
                     for(k=0;k<13;k++)w[k]=L"*";
                     dataGridView1->Rows->Add(w);
                   }
                   l=0;
                   for(k=0;k<9;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(j=0;j<13;j++)w[j]=L"*";
                 dataGridView1->Rows->Add(w);
                 for(j=0;j<13;j++)w[j]=L"";
                 dataGridView1->Rows->Add(w);
                 s++;

               }
             }
            }
        }

  };
}
実行例
入門

これにランダムを組み込むことは簡単です。
まず冒頭に
#pragma once
#include<stdlib.h>
int a[9][9];
int x[81],y[81];

int s;
namespace 順列方陣 {

     ・
     ・
     ・

#include<stdlib.h>を加えて、インクルードファイルstdlib.hを読み込むようにして、
さらに、
        void f(char g){
           if(s==100)return;  'すべて計算させるとかなり時間がかかるので100個で止めている。
           int i,j,k,l,xs,ys,h
,kk,kkk;
           array<String^>^ w=gcnew array<String^>(14);
          
kk=rand()%9;
           for(i=0;i<9;i++){
            
kkk=(kk+i)%9+1;
             a[y[g]][x[g]]=
kkk;
             h=1;

     ・
     ・
     ・
のようにを加えるないし変更すればよいのです。
実行例
初心者
解説
kk=rand()%9;によって、kkには9未満の整数がランダムに入ります。
rand()によって、ランダムな整数が発生させて、それを9で割った余りにしているからです。
kkk=(kk+i)%9+1;によってkkkはどのように動いていくのでしょうか。
例えば,kk=5であったとすると、iが0から8まで変化していくとき、
kkk=(5+0)%9+1=6
kkk=(5+1)%9+1=7
kkk=(5+2)%9+1=8
kkk=(5+3)%9+1=9
kkk=(5+4)%9+1=1
kkk=(5+5)%9+1=2
kkk=(5+6)%9+1=3
kkk=(5+7)%9+1=4
kkk=(5+8)%9+1=5
と動いていきます。結局、1から9まで網羅されていますが、
始まりが6からとなっているのです。
要するにkk=rand()%9;によって始まりを変えることによって自然な数独としているのです。

これで自然な数独を作るという課題が実現できました。

いよいよ卒業試験を残すのみです。
さあ、卒業試験を受けて合格できたら卒業です。
がんばりましょう。


第4話へ 第6話へ


025


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



数学研究室に戻る