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


第15話 入力ミスをスペースで訂正出来るように変更する
From1変更部分
c++
コード変更部分
#pragma endregion
  private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
          int i,j;
          array<String^,2>^ w=gcnew array<String^,2>(15,100);
          for(i=0;i<15;i++)dataGridView1->Rows->Add();
          for(i=0;i<14;i++){
            for(j=0;j<14;j++){
              
if(static_cast<String^>(dataGridView1[j,i]->Value)!=L" " && static_cast<String^>(dataGridView1[j,i]->Value)!=L" "){
                w[i,j]=static_cast<String^>(dataGridView1[j,i]->Value);
              }
              if(static_cast<String^>(dataGridView1[j,i]->Value)==L" " || static_cast<String^>(dataGridView1[j,i]->Value)==L" " ){
                w[i,j]=L"";
              }

            }
          }
                     ・
                     ・
                     ・
解説
スペースでデータを消して実行するとエラーする原因は、何も入ってないように見える欄にスペースが入っているからです。
なので、スペースが入っていないときだけ欄の値を代入し、スペースが入っている場合にはL""を代入するように変更しました。
これで実行エラーは解消します。
以上で、数独(ナンバープレイス)問題解決ソフトVer.1は一応の完成です。『一応の』と付けた理由は、この後小改良をするからです。
ダウンロード用参考ファイルForm1.h
ダウンロード用参考ファイル実行ファイル(EXEファイル)

その後いろいろ実験して、問題によっては問題を解くのに膨大な時間がかかってしまう場合があることが判明しました。
例えば、
vc++という問題なら22秒(私の使用パソコンで)かかってしまいます。
また、解が複数存在(存在個数は京の単位を遙かに超える)してしまう不適切な問題ですが、
入門ですと、
今実験の途中ですがすでに10分経過していますが未だに答えを出していません。
おそらく、1時間待っても出てこないかもしれません。
解が存在し、しかも別解が存在しない適切な問題なら、おそらくどんな問題でも30秒以内では解けるでしょう。
しかし、私が作ったVBA版Ver.7なら上の不適切な問題でも、適正な問題であってもすべて0.1秒以内で解けます。
ネットに載っていた世界で一番難しい数独の問題も確か記憶によりますと0.02秒程度で解きました。

Ver.1でもほとんどの超上級問題が0.03秒以内で解けるのに、問題によっては1時間以上かかってしまうのはなぜでしょうか。
実は、Ver.1には苦手な問題があるのです。
それが、上の2つの問題です。
ただし、初心者の方はちょっとした小改良で0.01秒程度で
答えの1つを打ち出し、答えの複数ある不適切名問題であるの結論を出すことが出来るようになります。
その改良とは何かは、なぜ上の問題が苦手なのか考えればわかります。
Ver.1の暫定版は、左のセルから順番に1から入れていきます。
このやり方だと、上の問題パターンの場合うまくいかないのでしょう。
(もっともどうしてなのかは、私にもわかりません。だから、推量になっています。)
さて、考えながらタイピングしていたらさらに10分は経過しました。
実験を始めてから、20分は経過しましたがVer.1は未だに結論を出していません。
実験を打ち切りたいと思います。
小改良実験のためです。

今実験に成功しました。予想通り、上の不適切問題に対して答えの1つ
初歩を打ち出し、
はじめての解答が複数存在する不適切な問題であると結論を出しています。
解答作成時間は、なんと0.004秒程度です。
さて、そのちょっとした小改良とは何でしょうか。
ヒントは、
第24講 数独解答の作成☆
 第1話 数独とは?
 第2話 数独解答ソフト解答例
 第3話 ブロック境界線解答例
 第4話 ブロック重複判定部分解説
にあります。

ちょっと不親切でしょうか。
では、初歩に注目しましょう。答えは京の単位を遙かに超えるほどあります。
だったら、答えの1つは順に入れていく方式なら2から始まっていたはずです。
何かの言葉が思い浮かびませんか。

それは、ランダムです。




第14話へ 第16話へ

戻る

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