Baumkuchen’s Workshop

バイオリンと電子工作、DIY、ジョギングなど。

お絵描きロジックパズル解法プログラムを作る#2

アルゴリズム検討(その1)

1.一列分

1-1.黒

ルール1 左詰と右詰の重なり

f:id:Baum_kuchen:20210130205346p:plain

<基本>

初期状態で未だ何も確定していない状況から

 最初の数字に対する黒列を左黒詰めで置く。一マス空けて、次の数字に対応する黒列を置く。以下、数字が終わるまで、それを繰り返す。

 これで、左詰めのバターが完成。

 同様にして、右詰パターンを作成。

 その後、左詰パターンと右詰パターンをマス位置毎にandを取れば完成。

 

アルゴリズム的に書くと

f:id:Baum_kuchen:20210130203955p:plain

 

<発展>

既に何か所か、黒、または白の確定がある前提も同様の処置が可能。

この場合、置けるか?の部分をちゃんと実装しないとだめ。

置ける場合の判定として、

・当該のマス目(及び左右1マス)だけをみて判断

・問題として矛盾がないかまで判断

がいるが、後者はちょっと難しいので、まず、前者から。青が置けるパターン、赤が置けないパターン。最後のマス外は、基本確定箇所を間違っていなければ発生しないはず。

f:id:Baum_kuchen:20210130210955p:plain

置こうとする黒列の範囲内に何もなければ必ず置ける(初期状態)。白があったらダメ、黒はOK。黒列の外側1個目が黒はダメというものです(問題のマス目の外周に接する場合は、そちらは判定不要)。

 

次に、問題として矛盾がないかは、問題の数列について、すべてを含めて整合性をチェックしないといけないので、どのようなアルゴリズムが良いかは少し考えます。例としては、次のような場合です。3番目の2が赤枠の位置におけるかは、その番号だけに着目すれば置けますが、当然その右方向に黒マスがあるので、そこに置くと問題として矛盾する訳です。

f:id:Baum_kuchen:20210130211727p:plain

自分で解いているとき、どのように判断しているか整理してみます。
ただ、重なりを考えるとき、問題として矛盾があるものは、重ならないと思われるので、あえてそれを区別する必要は無いかもしれません。

 

まずは、上記について一旦プログラムとして、検証して行くこととします。

(2021.2.6更新)

フリーのお絵描きロジック問題集より、簡単な10×10の問題を選択。

f:id:Baum_kuchen:20210206131949p:plain

ルール1を適用して解いてみた結果。

f:id:Baum_kuchen:20210206132042p:plain

こうなりました。問題枠の下の横長の枠は、アルゴリズムチェック用のもの。

f:id:Baum_kuchen:20210206132948p:plain

正解と比べても、ほぼ解けている感じです。この問題については、ルール1でもそこそこ行けました。