Ce jeu de puzzle classique est-il complet?

10

Il y a un jeu de livre de puzzle classique très similaire à un puzzle de mots croisés, sauf qu'une liste de mots est donnée, puis un tableau carré composé de carrés d'unité est donné, avec quelques carrés noircis comme un mot croisé, et certains carrés contiennent déjà une lettre pré-écrite. Le but est d'écrire chaque mot de la liste une fois et une seule fois dans le puzzle, où chaque mot est écrit horizontalement (de gauche à droite) ou verticalement (de haut en bas) dans des carrés consécutifs non noircis, et lorsque vous écrivez un mot , les deux carrés flanquant les extrémités du mot doivent être soit noircis, soit hors du tableau. De même pour les lettres pré-écrites dans certains carrés, les mots écrits qui chevauchent ces carrés doivent respecter la lettre pré-écrite.N×N

Maintenant, si nous supposons un alphabet de taille fixe pour les mots, décide si nous pouvons remplir le tableau avec une solution valide en utilisant exactement chaque mot de la liste une fois et une seule fois un problème NP-complet, si la longueur du côté du tableau est pas fixe?

user2566092
la source

Réponses:

6

Désolé d'avoir répondu à un ancien message.

J'y ai pensé et je pense que le problème avec un alphabet fixe est également NP-complet.

Je vais réduire le SAT 1-en-3 positif à ce problème de mot

Hier, j'avais du mal à trouver des idées pour résoudre le problème. J'ai eu du mal à rendre chaque variable différente jusqu'à ce que je revoie la question et que je réalise que vous autorisez à avoir des carrés avec des symboles plantés. Cela a beaucoup simplifié la réduction. Mon autre idée était d'avoir des mots de longueur différente pour chaque variable différente.

LA RÉDUCTION

Je vais maintenant décrire les gadgets que nous allons utiliser:

Gadget variable

Nous étiquetons chaque variable avec un index numérique différent et nous aurons un nombre différent pour chaque variable. On choisit le plus grand indice et on représente le nombre en binaire, on appellera cette chaîne binaire .n

Ensuite, nous créons deux mots verticaux différents pour chaque variable. Tous les mots auront une longueur de (Seulement si nous autorisons les mots en double dans la liste des mots), où | n | est la longueur de la chaîne binaire n .3+|n||n|n

Par exemple, que le plus grand indice soit le nombre . Lorsque nous transformons ce nombre en binaire, nous obtenons la chaîne 100 en binaire, cette chaîne a une longueur de trois. Ainsi, chaque mot variable aura une longueur de 6 dans cet exemple.41006

Maintenant, nous créons deux mots différents pour chaque variable. Un mot aura le symbole au début, puis le symbole 2 ci-dessous, puis une chaîne binaire qui représente l'index de la variable et on remplit avec des zéros la chaîne pour qu'elle ait la même longueur que la chaîne n et enfin le symbole 3 à la fin. Bien sûr, les symboles peuvent être modifiés.32n3

L'autre mot est presque le même mais il aura le symbole au lieu du symbole 3 .43

Par exemple, que le plus grand indice soit le nombre . Nous aurons les deux mots suivants pour la variable d'index 1 :41

et 420014320013420014

Comme nous le voyons, nous avons rempli la représentation binaire du nombre avec des zéros afin qu'il ait une longueur de | n |1|n|

Nous devons copier ces mots plusieurs fois, nous aurons besoin d'une copie de chaque mot pour chaque occurrence d'une variable dans l'instance SAT. Cela créera des doublons dans la liste des mots. Nous pouvons nous débarrasser des doublons en ajoutant une autre chaîne binaire à la chaîne binaire qui identifie de manière unique la variable. Cette nouvelle chaîne identifiera de manière unique chaque occurrence d'une variable.

Pour ce faire, nous attribuons simplement à chaque occurrence de la variable une autre chaîne binaire et nous olace cette chaîne à la fin de la représentation binaire de la variable.

Pour créer cette nouvelle chaîne binaire, nous devons d'abord créer un index différent pour chaque variable, nous appelons le plus grand nombre de chaque index i est un identifiant pour chaque variable. Après cela, nous transformons le nombre n i en une chaîne binaire et ensuite nous comptons la longueur de la chaîne, nous appelons ce nombre | n i | . Ensuite, pour chaque index, nous créons un nombre binaire différent pour chaque occurrence de la variable. Nous remplissons le nombre de zéros jusqu'à ce que la longueur de la chaîne binaire devienne | n i | de sorte que tous les mots qui appartiennent à chaque occurrence de la variable ont la même longueur.niini|ni||ni|

Cela supprimera les doublons à l'intérieur des mots variables.

x2

32010013 4201001432010103 4201010432010113 42010114

Gadget Clause

6

535354535453545353

435

mm|m||m|. Nous ajoutons chaque chaîne binaire aux mots de clause qui appartiennent à la clause.

Voyons maintenant une image d'un gadget de clause dans le tableau:

Exemple de clause

(x2x3x4)(x1x2x3)(x2x3x4)

4

Si nous n'autorisons pas les doublons dans la liste des mots, nous devrons modifier l'image.

5b5b5b10

b201010bb201110bb21001b

b

Voir un exemple:

clause, pas de répétition

Gadget à cohérence variable

Il s'agit d'un gadget qui garantit que le lecteur ne peut attribuer la même valeur qu'à toutes les colonnes littérales d'une variable.

Nous aurons un nouveau gadget pour chaque variable

Nous allons créer deux nouveaux mots pour chaque gadget.

2kkx263 k64 k

x2

63636464

Si nous voulons éviter les mots répétés, notez que chaque gadget de cohérence appartient à une variable différente. Nous pouvons donc ajouter la chaîne binaire qui identifie chaque variable aux deux mots que nous avons créés pour ce gadget.

Voyons maintenant un exemple d'image de ce gadget:

Gadget à cohérence variable

x2(x1x2x3)(x2x3x4)

3434. Nous pouvons placer le mot restant de ce gagdet dans l'autre ligne

Si nous n'autorisons pas les doublons dans la liste des mots, les mots à l'intérieur de l'exemple d'image seront:

Pour les rangées:

6b6b0106b6b010

Pour les colonnes:

b201001bb201010b

b

Voir un exemple:

Gadget de cohérence, pas de répétitions

Clause de vidage du gadget

Il s'agit d'un gadget créé pour placer les mots de clause inutilisés. Pour ce faire, nous n'avons qu'à placer deux lignes pour chaque mot de clause dans une partie vide du tableau. Ces lignes ne sont connectées à aucune autre ligne ou colonne.

Avec cela, nous finissons la réduction, comme nous l'avons affirmé, nous n'avons besoin que de 6 symboles pour la réduction.

Exemple

Si l'explication précédente était déroutante, voici un exemple d'image d'une instance de SAT positif 1 sur 3 qui a été réduite à ce mot problème:

Exemple de tableau

Si nous interdisons les mots répétés:

Exemple de tableau, pas de répétitions

L'instance qui a été réduite est:

(x1x2x3)(x2x3x4)

rotia
la source
Merci d'avoir posté ceci! Une caractéristique malheureuse de Stack Exchange est qu'il est peu probable que les réponses longues soient lues par quiconque, il est donc très peu probable que vous gagniez de nombreux votes grâce à la tonne de travail que vous avez effectuée, ici. J'essaierai de lire ceci mais, si je suis honnête, il y a de fortes chances que je n'y arrive pas.
David Richerby
2
@DavidRicherby jaja yes. Je réfléchissais à cette question pendant un certain temps. Je pensais que lorsque j'aurais posté cette réponse, tout le monde irait voter. Cela ne s'est pas produit. Eh bien peu importe. Si vous avez des questions sur la réduction, vous pouvez me demander
rotia
4

Je pense que la réduction suivante du chemin hamiltonien dirigé fonctionne:

G=(V,E)s,tV

V{}V

vvvVvu(u,v)E

|V|

escaliers

|E|(|V|1)

sstt

Maintenant, pour remplir les escaliers, seuls les mots-sommets peuvent être placés dans les marches, et pour relier deux sommets, un mot de bord doit être placé entre eux, ce qui correspond à un bord existant dans le graphique. Les bords non utilisés peuvent être placés dans la deuxième partie de la planche. La deuxième direction est triviale.

Je pense que cela fonctionne (la preuve d'exactitude que j'ai esquissée est au mieux agitée à la main, mais quand même).

Shaull
la source
1
stN×NN
C'est sympa et semble fonctionner, mais la taille de l'alphabet n'est pas fixée comme mon message d'origine l'a demandé. Y a-t-il une modification possible pour utiliser un alphabet de taille fixe et toujours faire cette réduction?
user2566092
uv