¿Es este clásico juego de rompecabezas NP-complete?

10

Hay un clásico juego de rompecabezas muy similar a un crucigrama, excepto que se da una lista de palabras y luego se da un tablero cuadrado compuesto de cuadrados unitarios, con algunos cuadrados ennegrecidos como una palabra cruzada, y algunos cuadrados ya tienen una letra preescrita. El objetivo es escribir cada palabra de la lista una vez y solo una vez en el rompecabezas, donde cada palabra se escribe horizontalmente (de izquierda a derecha) o verticalmente (de arriba abajo) en cuadrados consecutivos no oscurecidos, y cuando escribe una palabra , los dos cuadrados que flanquean los extremos de la palabra deben estar apagados o fuera del tablero. También para las letras preescritas en algunos cuadrados, las palabras escritas que se superponen a estos cuadrados deben respetar la letra preescrita.N×N

Ahora, si asumimos un alfabeto de tamaño fijo para las palabras, estamos decidiendo si podemos llenar el tablero con una solución válida usando exactamente cada palabra en la lista una vez y solo una vez un problema de NP completo, si la longitud del lado del tablero es ¿no arreglado?

usuario2566092
fuente

Respuestas:

6

Perdón por responder una publicación anterior.

He estado pensando en ello y creo que el problema con un alfabeto fijo es NP-completo también.

Voy a reducir el SAT positivo 1 en 3 a este problema verbal

Ayer tuve problemas para encontrar ideas para resolver el problema. Tuve problemas para hacer que cada variable fuera diferente hasta que volví a mirar la pregunta y me di cuenta de que permitías tener cuadrados con símbolos plantados. Esto simplificó mucho la reducción. Mi otra idea era tener palabras de diferente longitud para cada variable diferente.

LA REDUCCIÓN

Ahora voy a describir los gadgets que vamos a usar:

Gadget variable

Rotulamos cada variable con un índice numérico diferente y tendremos un número diferente para cada variable. Elegimos el índice más grande y representamos el número en binario, llamaremos a esta cadena binaria .n

Luego creamos dos palabras verticales diferentes para cada variable. Todas las palabras tendrán una longitud de (Solo si permitimos palabras duplicadas en la lista de palabras), donde | n | es la longitud de la cadena binaria n .3+|n||n|n

Por ejemplo, que el índice más grande sea el número . Cuando transformamos este número en binario obtenemos la cadena 100 en binario, esta cadena tiene una longitud de tres. Por lo tanto, cada palabra variable tendrá una longitud de 6 en este ejemplo.41006

32n3

43

41

320013420014

1|n|

Tenemos que copiar estas palabras muchas veces, necesitaremos una copia de cada palabra para cada aparición de una variable en la instancia SAT. Esto creará duplicados en la lista de palabras. Podemos deshacernos de los duplicados agregando otra cadena binaria a la cadena binaria que identifica de forma exclusiva la variable. Esta nueva cadena identificará de manera única cada aparición de una variable.

Para hacer eso, simplemente asignamos a cada ocurrencia de la variable otra cadena binaria y ubicamos esa cadena al final de la representación binaria de la variable.

niini|ni||ni|

Esto eliminará los duplicados dentro de las palabras variables.

x2

32010013 4201001432010103 4201010432010113 42010114

Cláusula gadget

6

535354535453545353

435

mm|m||m|. Anexamos cada cadena binaria a las palabras de la cláusula que pertenecen a la cláusula.

Ahora, veamos una imagen de un dispositivo de cláusula en el tablero:

Cláusula de ejemplo

(x2x3x4)(x1x2x3)(x2x3x4)

4

Si no permitimos duplicados dentro de la lista de palabras, tendremos que modificar la imagen.

5b5b5b10

b201010bb201110bb21001b

b

Ver un ejemplo:

cláusula, no se repite

Gadget de consistencia variable

Este es un gadget que garantiza que el jugador solo puede asignar el mismo valor para todas las columnas literales de una variable.

Tendremos un nuevo gadget para cada variable

Crearemos dos palabras nuevas para cada gadget.

2kkx263 k64 k

x2

63636464

Si queremos evitar palabras repetidas, observe que cada gadget de coherencia pertenece a una variable diferente. Entonces podemos agregar la cadena binaria que identifica cada variable a las dos palabras que creamos para este gadget.

Ahora veamos una imagen de ejemplo de este gadget:

Gadget de consistencia variable

x2(x1x2x3)(x2x3x4)

3434. Podemos colocar la palabra restante de este gagdet en la otra fila

Si no permitimos duplicados en la lista de palabras, las palabras dentro de la imagen de ejemplo serán:

Para las filas:

6b6b0106b6b010

Para las columnas:

b201001bb201010b

b

Ver un ejemplo:

Dispositivo de consistencia, sin repeticiones

Cláusula volcado gadget

Este es un gadget creado para colocar las palabras de cláusula no utilizadas. Para hacer eso, solo tenemos que colocar dos filas para cada palabra de la cláusula en una parte vacía del tablero. Estas filas no están conectadas a ninguna otra fila o columna.

Con esto terminamos la reducción, ya que afirmamos que solo necesitamos 6 símbolos para la reducción.

Ejemplo

Si la explicación anterior era confusa, aquí hay una imagen de ejemplo de una instancia de SAT positivo 1 en 3 que se ha reducido a este problema verbal:

Tablero de ejemplo

Si no permitimos palabras repetidas:

Ejemplo de tablero, sin repeticiones

La instancia que se ha reducido es:

(x1x2x3)(x2x3x4)

Rotia
fuente
¡Gracias por publicar esto! Una característica desafortunada de Stack Exchange es que es poco probable que alguien lea las respuestas largas, por lo que es muy poco probable que obtenga muchos votos de la tonelada de trabajo que ha hecho, aquí. Intentaré leer esto, pero, si soy sincero, hay una buena posibilidad de que no lo logre.
David Richerby
2
@DavidRicherby jaja sí. Estuve pensando en esta pregunta por un tiempo. Pensé que cuando publique esta respuesta, todos irán a votarla. No sucedió Bueno, olvidalo. Si tiene preguntas sobre la reducción, puede preguntarme
rotia
4

Creo que la siguiente reducción del camino Hamiltoniano dirigido funciona:

G=(V,E)s,tV

V{}V

vvvVvu(u,v)E

|V|

escalera

|E|(|V|1)

sstt

Ahora, para llenar las escaleras, solo se pueden poner palabras de vértice dentro de los escalones, y para conectar dos vértices, se debe colocar una palabra de borde entre ellos, que corresponde a un borde existente en el gráfico. Los bordes no utilizados se pueden poner en la segunda parte del tablero. La segunda dirección es trivial.

Creo que esto funciona (la prueba de corrección que dibujé es agitada a mano en el mejor de los casos, pero aún así).

Shaull
fuente
1
stN×NN
Esto es bueno y parece funcionar, pero el tamaño del alfabeto no está arreglado como lo solicitó mi publicación original. ¿Hay alguna modificación posible para usar un alfabeto de tamaño fijo y aún hacer esta reducción?
user2566092
uv