制約ソルバー
整数計画ソルバー
SCIP
で過去、解いてみたのは、
シャカシャカ
スリザーリンク
ミッドループ
古典の碁石拾い
とかとか
カックロはまだ、解いてない。
盤面入力の問題はさておき、コアのところだけ、考えてみると。
カックロ
①ひとつの空白マスAに対して
a1 a2 a3 a4 a5 a6 a7 a8 a9 という変数を用意。
binary値(論理値)でそのマスが、1であるかどうか、2であるかどうか・・・・という値。
どれか1個が1(true)になるので
a1+a2+a3+a4+a5+a6+a7+a8+a9=1 となる。
それを全空白マス分
②その空白マスAがいくつかという変数も用意する。
a1=1 => a=1
a2=1 => a=2
a3=1 => a=3
・・・4~9も同様
となる。
全空白マス分。
③すべての表出数字に対して、合計の式をたてる
a + b + c + d =15
全表出数字分。
④「同じ数字を使ってはいけない」
ひとつの表出数字に対応した一連の縦、横のマスメに対して、
a1 + b1 + c1 + d1 <=1
a2 + b2 + c2 + d2 <=1
a3 + b3 + c3 + d3 <=1
・・・3~9も同様
数独の解き方の、ちょいプラスぐらいの感じ。
⑤ 唯一解チェック
①~④までの式をたてて溶かして、解がなければ、解なし
解があれば、解あり。
「一番目の答え封じの式」を付け加えてもう1回解いて
解があれば、別解あり。
答え封じの式は
例えば全空白マス目が40個だったら。
1番目の解の①での変数のtrueになったものを全空白マス目分足して
a? + b? + c? + d? + e? + f? + ........ <=39
といったところ。