第1講 序章(数独自動生成を実現するための課題)
第1話 数独の成立条件
数独が成立するための条件は何でしょうか。
それを考えるために数独のルールを確認しましょう。
ルールは、
「どの行・列・ブロックにも1から9までの数字をひとつずつ並べる」
※本講義では、横列を行、縦列を単に列と呼びます。プログラミングの世界でもそうですね。
でした。これは言いかえると、1から9の任意の数字について、
「いかなる行・列・ブロックでも数字を重複させてはならない」ということです。
ですから、数独を自動生成させるためには、
「問題作成の段階でいかなる行・列・ブロックでも数字を重複させてはならない」のは当然です。
問題において重複していれば、解答でも重複してしまい解が存在しなくなるからです。
※本講義では解答を解と呼ぶ場合もあります。
それに関連して「問題作成の段階でいかなる行・列・ブロックでも数字を重複させてはならない」に、
数独成立条件には「唯一解が存在する」が不可避の条件として加わります。
パズルですから、解答があってその解答はただ1つだけでなければならないからです。
「唯一解が存在する」は、次の2つに分解することが出来ます。
ⅰ.解が存在する
ⅱ.別解が存在しない
さらに、数独愛好者は仮定法(試行錯誤法)を解法として認めないので、
ⅲ.理詰めで解ける
を付け加えるべきであるとお思いになりますね。
厳密に言えば、ⅲがあればⅰとⅱは自動的に満たされているのですが、
数独ファンの思いには、数独自動作成アプリを開発する際には充分な根拠があります。
数独自動生成ソフトを段階的に実現していくには、
ⅲとⅰ・ⅱを区別しておいた方がよいのです。
つまり、最初はⅰとⅱだけ満たすソフトを開発して、
次に、ⅲを満たすソフトに高めていった方がよいのです。
ですから、最初に開発するソフトは4題に1題ぐらいの割合で、
仮定法を使わなければ解けない問題を生成してしまうことに、
妥協しなければならないのです。
4題に3題は理詰めで解ける問題が生成されていますので、
理詰めで解けない問題と理詰めで解ける問題をいかに識別すべきかが、
課題になります。
番号を振り直して、数独成立条件をまとめ直すと
ⅰ.問題作成段階で、いかなる行・列・ブロックにおいても数字を重複させてはならない
ⅱ.解が存在する
ⅲ.別解が存在しない
ⅳ.理詰めで解ける問題を選ぶ