TOP > 数独解答 > 制作秘話
*********************************************************************************************** 数独解答 制作秘話 Copyright(C) 2012 by しげるがもげる *********************************************************************************************** ◆はじめに このドキュメントには、制作に関わっての作者の思いや苦労が書いてあります。 技術的な細かいことに興味のない方は、読み飛ばしてください。 エクセルでマクロを組んでみようかなと思われる方は、読むと参考になる部分があるかもしれません。 ◆制作秘話 数独をネットで調べてみると、解答を求めるソフトがあることがわかりました。 その記事を読んでみると、片っ端から数符を入れて調べていく、いわゆる「しらみつぶし探索」を行っていると 書いてありました。『これだったら、僕にも作れそうだ。』 そんなことを思って、作ってみたのがこれです。 ◆工夫や苦労など <しらみつぶし探索> しらみつぶし探索を行うには、「あるセルの候補値を探してその中から適当に数字を入れ、次のセルに進んで 候補値を探してその中から適当に数字を入れ・・・」ということを繰り返す仕組みが必要です。 また、途中でできなくなったら、一つ前のセルに戻って、次の候補値を入れて続きを行う仕組みも必要になります。 つまり、この2つのことを答えが出るまで延々と行うのが、しらみつぶし探索なのです。 通常は、セルの位置を決めるのに、行位置と列位置で扱います。しかし、セルを1つ戻るという操作をするとき 列位置が1の時は処理がややこしくなります。列位置を9に戻して行位置を1つ小さくしなければなりませんから。 そこで、もっと簡単に計算できるように、1〜81までの連番で位置を扱うことにしました。そして、計算して 行位置と列位置を出すようにしました。このことで、セルを1つ戻す時には単純に−1すればいいことになります。 また、連番から行位置・列位置がすぐ計算できるように、ユーザー定義関数を作りました。 このことにより、解答が完成したかどうかの判断は、セルの連番が81を越えたかどうかで行えるようになりました。 しらみつぶし探索は、時によって時間がすごくかかるときがあります。そんなときに、中断できるようにフラッグを 立てて、その値を変えることでプログラムを中断できるようにしました。 <次の候補値を返すユーザー定義関数> 数独のソフトを作るに当たって、候補値を返すユーザー定義関数は以前に作っていました。しかしここで必要になるのは、 セルに適当に入れた数字がダメだった場合、その次の候補値が知りたくなります。そこで、次の候補値を返す ユーザー定義関数も作りました。これで、プログラムが見やすくなりました。 <単純チェックを最後まで行う> 単純チェックは、そのセルに入る数字の候補値がどんな数字か調べるものです。候補値が1つだったら、その数字に 決定なので、書き込めばいいですね。しかし、これだけでは、1回処理を行うごとに止まってしまいます。 そこで、処理ができるうちは、連続で処理をさせるようにしました。 フラッグを立てて、処理を1回でもしたときにはTrueにし、Do〜Loop文を使ってTrueの間は処理を続けるようにしました。 これによって、1つの処理が完結することがでいました。 縦・横・大マスで候補が1つだけの場合も、同様に処理をするようにしました。 ◆最後に ここまで、熱心に読んでくださってありがとうございました。 プログラムを組んだことのない方には、わかりにくい内容だと思いますが、これを機会にエクセルの マクロに興味を持っていただければ、と思っています。 エクセルは、本当に楽しいツールです。自分の思いや考えが表現できます。 そんなエクセルに、日々、感謝です。