この古典的なパズルブックゲームはNPコンプリートですか?


10

クロスワードパズルに非常によく似た古典的なパズルブックゲームがありますが、単語のリストが表示され、次に、ユニットスクエアで構成された正方形のボードが表示されます。一部の四角には、あらかじめ文字が書き込まれています。目標は、リスト内の各単語をパズルに1回だけ書き込むことです。各単語は、水平(左から右)または垂直(上から下)に、黒く塗りつぶされていない連続した四角形に書き込まれます。 、単語の両端に隣接する2つの四角形は、ブラックアウトするか、ボードから外す必要があります。また、いくつかの正方形に事前に書かれた文字については、これらの正方形に重なるように書かれた単語は、事前に書かれた文字を尊重しなければなりません。N×N

ここで、単語の固定サイズのアルファベットを想定すると、ボードの辺の長さがである場合、リストの各単語を正確に1回だけ使用して、ボードを有効なソリューションでボードに埋め込むことができるかどうかを決定します未修理?

回答:


6

古い投稿に答えてすみません。

私はそれについて考えてきました、そして固定アルファベットの問題もまたNP完全だと思います。

この単語の問題に対して、肯定的な1対3のSATを削減します

昨日、問題を解決するためのアイデアが思いつかなかった。質問をもう一度確認するまで、各変数を異なるものにするのに苦労し、シンボルが埋め込まれた正方形を使用できることに気づきました。これにより、削減が大幅に簡素化されました。私の他のアイデアは、変数ごとに異なる長さの単語を持つことでした。

削減

次に、使用するガジェットについて説明します。

可変ガジェット

各変数には異なる数値インデックスでラベルを付け、変数ごとに異なる番号を割り当てます。最大のインデックスを選び、その数をバイナリで表します。このバイナリチェーンをと呼びます。n

次に、変数ごとに2つの異なる垂直方向の単語を作成します。すべての単語の長さは(単語のリストで単語の重複を許可する場合のみ)、ここで| n | バイナリチェーンnの長さです。3+|n||n|n

たとえば、最大のインデックスをます。この数値をバイナリで変換すると、チェーン100がバイナリで取得されます。このチェーンの長さは3です。したがって、この例では、各可変ワードの長さは6になります。41006

次に、変数ごとに2つの異なる単語を作成します。1つの単語には、最初に記号、次に下の記号2、次に変数のインデックスを表すバイナリチェーンがあり、チェーンnと同じ長さになるようにチェーンをゼロで埋め、最後にシンボル3にします最後に。もちろん、シンボルは変更できます。32n3

もう1つの単語はほとんど同じですが、記号3ではなく記号になります。43

たとえば、最大のインデックスをます。インデックス1の変数には、次の2つの単語があります。41

および 420014320013420014

ご覧のとおり、数値バイナリ表現にゼロを埋め込んで、|の長さを|にしています。n |1|n|

これらの単語を何度もコピーする必要があります。SATインスタンスで変数が出現するたびに、各単語のコピーが1つ必要です。これにより、単語のリストに重複が作成されます。変数を一意に識別するバイナリチェーンに別のバイナリチェーンを追加することで、重複を取り除くことができます。この新しいチェーンは、変数の各オカレンスを一意に識別します。

そのためには、変数の各オカレンスに別のバイナリチェーンを割り当てるだけで、そのチェーンを変数のバイナリ表現の最後に配置します。

この新しいバイナリチェーンを作成するには、まず各変数に異なるインデックスを作成する必要があります。各インデックスの最大数をと呼びます。ここで、iは各変数の識別子です。その後、数値n iをバイナリチェーンに変換し、チェーンの長さをカウントします。この数値を| n i | 。次に、インデックスごとに、変数の出現ごとに異なる2進数を作成します。バイナリチェーンの長さが|になるまで、数値にゼロを埋め込みますn i | 変数の各オカレンスに属するすべての単語が同じ長さになるようにします。niini|ni||ni|

これにより、変数ワード内の重複が取り除かれます。

x2

32010013 4201001432010103 4201010432010113 42010114

条項ガジェット

6

535354535453545353

435

mm|m||m|。節に属する節の単語に各バイナリチェーンを追加します。

さて、ボード内の条項ガジェットの写真を見てみましょう:

句の例

(x2x3x4)(x1x2x3)(x2x3x4)

4

単語リスト内の重複を許可しない場合は、画像を変更する必要があります。

5b5b5b10

b201010bb201110bb21001b

b

例を見る:

句、繰り返しなし

可変一貫性ガジェット

これは、プレーヤーが変数のすべてのリテラル列に同じ値のみを割り当てることができるようにするガジェットです。

各変数に新しいガジェットを作成します

ガジェットごとに2つの新しい単語を作成します。

2kkx263 k64 k

x2

63636464

単語の繰り返しを避けたい場合は、各整合性ガジェットが異なる変数に属していることに注意してください。したがって、このガジェット用に作成した2つの単語に、各変数を識別するバイナリチェーンを追加できます。

次に、このガジェットのサンプル画像を見てみましょう。

可変一貫性ガジェット

x2(x1x2x3)(x2x3x4)

3434。このgagdetの残りの単語を別の行に配置できます

単語リストの重複を許可しない場合、サンプル画像内の単語は次のようになります。

行の場合:

6b6b0106b6b010

列の場合:

b201001bb201010b

b

例を見る:

一貫性ガジェット、繰り返しなし

句ダンプガジェット

未使用の句を配置するために作成されたガジェットです。そのためには、ボードの空白部分に各句の単語ごとに2行を配置するだけです。これらの行は他の行または列に接続されていません。

削減に必要なシンボルは6つだけであると主張したため、これで削減を完了しました。

前の説明が混乱していた場合は、この単語の問題に削減された肯定的な1 in 3 SATのインスタンスの例の画像を次に示します。

ボード例

単語の繰り返しを禁止する場合:

ボード例、繰り返しなし

削減されたインスタンスは次のとおりです。

(x1x2x3)(x2x3x4)


これを投稿してくれてありがとう!Stack Exchangeの残念な特徴は、長い回答が誰にも読まれない可能性が高いため、ここで行った大量の作業から多くの票を獲得する可能性が非常に低いことです。これを読んでみますが、正直に言えば回避できない可能性が高いです。
David Richerby 2016年

2
@DavidRicherby jajaはい。この質問でしばらく考えていました。私がこの回答を投稿したとき、みんなが行き、賛成票を投じると思いました。起こりませんでした。まあ気にしないでください。削減について質問がある場合は、私に尋ねることができます
ロティア

4

有向ハミルトニアンパスからの次の削減が機能すると思います。

G=(V,E)s,tV

V{}V

vvvVvu(u,v)E

|V|

階段

|E|(|V|1)

sstt

ここで、階段を埋めるために、ステップ内に頂点ワードのみを配置できます。2つの頂点を接続するには、エッジワードをそれらの間に配置する必要があります。これは、グラフの既存のエッジに対応します。未使用のエッジは、ボードの2番目の部分に配置できます。2番目の方向は簡単です。

私はこれがうまくいくと思います(私がスケッチした正確さの証明はせいぜい手振れですが、それでも)。


1
stN×NN

これは素晴らしいですし、うまくいくようですが、要求された私の元の投稿のようにアルファベットのサイズは固定されていません。固定サイズのアルファベットを使用することは可能ですか?それでもこの削減は可能ですか?
user2566092 14

uv
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.