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