問題をSATにマッピングし、SATソルバーを使用します。かなり自然なマッピングがあります。変数を定義します。
x_s_i_j_d = segment s starts at coordinates (i,j) and goes in direction d
(dは「右」または「下」です)
まず、すべてのセグメントと開始位置を反復処理し、開始マトリックスが与えられたときにどれが実行可能かを確認します。例、M:
000000000000
111111111111
...
セグメント1の長さが2の場合L_seg1_0_0_down = false
、塗りつぶされたスペースにヒットするため、。
次に、2つの交差するセグメントを禁止する句を記述します。セグメント1とセグメント2の両方が長さ2の場合、次の句を追加します。
(!L_seg1_0_0_right || !L_seg2_1_0_right)
セグメント1が座標(0,0)と(1,0)を使用している場合、セグメント2は(1,0)も使用できないためです。
最後に、各セグメントを少なくとも1回使用する必要があるという条件を追加します。
(L_seg1_0_0_right || L_seg1_0_1_right || ...)
seg1が行くことができるすべての位置のために。次に、お気に入りのSATソルバーをそれに投げます。