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


第11話 関数再帰版へ
コード例
#pragma once
#include<stdlib.h>
#include<math.h>
char a[9][9];
char s;
namespace 数独問題解決ソフトVer1 {
            ・
            ・
            ・
#pragma endregion
  private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
          int i,j;
          array<String^>^ x=gcnew array<String^>(15);
          for(i=1;i<14;i++){
            if(i%4==1)for(j=0;j<13;j++)x[j]=L"*";
            if(i%4!=1)for(j=1;j<13;j++){
              if(j%4==1)x[j]=L"*";
              if(j%4!=1)x[j-1]=L"";
            }
            dataGridView1->Rows->Add(x);
          }
//ここから
          dataGridView1[1,1]->Value=L"2";
          dataGridView1[2,2]->Value=L"5";
          dataGridView1[2,3]->Value=L"8";
          dataGridView1[3,3]->Value=L"1";
          dataGridView1[7,1]->Value=L"4";
          dataGridView1[6,2]->Value=L"8";
          dataGridView1[7,3]->Value=L"6";
          dataGridView1[9,1]->Value=L"3";
          dataGridView1[11,2]->Value=L"7";
          dataGridView1[1,7]->Value=L"9";
          dataGridView1[3,6]->Value=L"2";
          dataGridView1[5,5]->Value=L"9";
          dataGridView1[6,5]->Value=L"4";
          dataGridView1[5,7]->Value=L"2";
          dataGridView1[10,5]->Value=L"2";
          dataGridView1[9,6]->Value=L"9";
          dataGridView1[10,6]->Value=L"6";
          dataGridView1[11,6]->Value=L"5";
          dataGridView1[2,11]->Value=L"1";
          dataGridView1[5,9]->Value=L"6";
          dataGridView1[5,11]->Value=L"4";
          dataGridView1[6,11]->Value=L"3";
          dataGridView1[9,9]->Value=L"8";
          dataGridView1[10,9]->Value=L"3";
          dataGridView1[11,9]->Value=L"2";
          dataGridView1[10,10]->Value=L"5";

//ここまではいちいちデータを入力しなくてもいいようにしてあります。完成した暁にはすべて削除します。

       }

  private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
          array<String^,2>^ w=gcnew array<String^,2>(15,100); 
          int i,j;
          for(i=0;i<15;i++)dataGridView1->Rows->Add();
          for(i=0;i<14;i++){
            for(j=0;j<14;j++){
              w[i,j]=static_cast<String^>(dataGridView1[j,i]->Value);
            }
          }
          char k1=0,k2;
          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(w[i,j]!=L"")a[i-k1][j-k2]=int::Parse(w[i,j]);
                    if(w[i,j]==L"")a[i-k1][j-k2]=0;
                  }
                }
              }
            }
            s=0;
            f(0);
         }

         void f(char g){
           if(s==1)return;
           char x,y;
           x=g%9;
           y=g/9;
           char h,i,j,k1,k2;
           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==1)return;
             }
           }
           if(a[y][x]==0){
             for(i=1;i<10;i++){
               h=1;
               if(x>0){
                 for(j=0;j<x;j++){
                   if(a[y][j]==i){
                     h=0;
                     break;
                   }
                 }
               }
               if(h==1){
                 if(x+1<8){
                   for(j=x+1;j<9;j++){
                     if(a[y][j]==i){
                       h=0;
                       break;
                     }
                   }
                 }
               }
               if(h==1){
                 if(y>0){
                   for(j=0;j<y;j++){
                     if(a[j][x]==i){
                       h=0;
                       break;
                     }
                   }
                 }
               }
               if(h==1){
                 if(y+1<8){
                   for(j=y+1;j<9;j++){
                     if(a[j][x]==i){
                       h=0;
                       break;
                     }
                   }
                 }
               }
               if(h==1){
                 a[y][x]=i;
                 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==1)return;
                 }
                 a[y][x]=0;
               }
             }
           }
         }
  };
}

実行画面
c++
vc++

ダウンロード用参考ファイルは第12話に載せます。


いよいよ完成一歩前です。
最後、ブロックの条件を加えましょう。



第10話へ 第12話へ

戻る

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