TOP > 数独解答 > 制作秘話

***********************************************************************************************

                数独解答 制作秘話
                                                         Copyright(C) 2012 by しげるがもげる
***********************************************************************************************

◆はじめに
 このドキュメントには、制作に関わっての作者の思いや苦労が書いてあります。
 技術的な細かいことに興味のない方は、読み飛ばしてください。
 エクセルでマクロを組んでみようかなと思われる方は、読むと参考になる部分があるかもしれません。

◆制作秘話
 数独をネットで調べてみると、解答を求めるソフトがあることがわかりました。
 その記事を読んでみると、片っ端から数符を入れて調べていく、いわゆる「しらみつぶし探索」を行っていると
 書いてありました。『これだったら、僕にも作れそうだ。』
 そんなことを思って、作ってみたのがこれです。

◆工夫や苦労など
 <しらみつぶし探索>
  しらみつぶし探索を行うには、「あるセルの候補値を探してその中から適当に数字を入れ、次のセルに進んで
  候補値を探してその中から適当に数字を入れ・・・」ということを繰り返す仕組みが必要です。
  また、途中でできなくなったら、一つ前のセルに戻って、次の候補値を入れて続きを行う仕組みも必要になります。
  つまり、この2つのことを答えが出るまで延々と行うのが、しらみつぶし探索なのです。
  通常は、セルの位置を決めるのに、行位置と列位置で扱います。しかし、セルを1つ戻るという操作をするとき
  列位置が1の時は処理がややこしくなります。列位置を9に戻して行位置を1つ小さくしなければなりませんから。
  そこで、もっと簡単に計算できるように、1〜81までの連番で位置を扱うことにしました。そして、計算して
  行位置と列位置を出すようにしました。このことで、セルを1つ戻す時には単純に−1すればいいことになります。
  また、連番から行位置・列位置がすぐ計算できるように、ユーザー定義関数を作りました。
  このことにより、解答が完成したかどうかの判断は、セルの連番が81を越えたかどうかで行えるようになりました。
  しらみつぶし探索は、時によって時間がすごくかかるときがあります。そんなときに、中断できるようにフラッグを
  立てて、その値を変えることでプログラムを中断できるようにしました。

 <次の候補値を返すユーザー定義関数>
  数独のソフトを作るに当たって、候補値を返すユーザー定義関数は以前に作っていました。しかしここで必要になるのは、
  セルに適当に入れた数字がダメだった場合、その次の候補値が知りたくなります。そこで、次の候補値を返す
  ユーザー定義関数も作りました。これで、プログラムが見やすくなりました。

 <単純チェックを最後まで行う>
  単純チェックは、そのセルに入る数字の候補値がどんな数字か調べるものです。候補値が1つだったら、その数字に
  決定なので、書き込めばいいですね。しかし、これだけでは、1回処理を行うごとに止まってしまいます。
  そこで、処理ができるうちは、連続で処理をさせるようにしました。
  フラッグを立てて、処理を1回でもしたときにはTrueにし、Do〜Loop文を使ってTrueの間は処理を続けるようにしました。
  これによって、1つの処理が完結することがでいました。
  縦・横・大マスで候補が1つだけの場合も、同様に処理をするようにしました。

◆最後に
 ここまで、熱心に読んでくださってありがとうございました。
 プログラムを組んだことのない方には、わかりにくい内容だと思いますが、これを機会にエクセルの
 マクロに興味を持っていただければ、と思っています。
 エクセルは、本当に楽しいツールです。自分の思いや考えが表現できます。
 そんなエクセルに、日々、感謝です。