2012-03-01 12 views
8

Encontré el rompecabezas slant en Ubuntu. Quiero resolver el puzzle de manera lógica y no por ensayo y error, etc.Cómo resolver este rompecabezas lógicamente sin prueba y error

Las reglas son simples:

  1. Tenemos que llenar todas las casillas con la derecha o la izquierda oblicua.
  2. El número de inclinaciones que tocan un número debe ser igual a ese número.
  3. No se permiten bucles en el tablero. es decir, los sesgos no deben formar bucles.

Puzzle:

Question

Respuesta automática resuelto:

enter image description here

¿Por dónde empezar?

+0

Sin duda, necesitará una cierta cantidad de prueba y error. Puede descartar algunas opciones temprano, pero no creo que esto se pueda hacer sin retroceder. –

+1

@EAGER_STUDENT: Supongo que quiere decir [este juego] (http://manpages.ubuntu.com/manpages/lucid/man6/slant.6.html)? ¿No puedes echar un vistazo al código fuente para ver cómo lo resuelven? – James

+0

@AakashM sí, puedo resolver las cuadrículas simples lógicamente. En cuadrículas simples habrá números como 0, 4 o 1 en la esquina. Con esto como una herramienta lo resolveré. Cuando el ancho o la altura aumentan, el problema es que estas 3 cosas no están presentes en los rompecabezas más difíciles. –

Respuesta

2

En lugar de inclinar hacia la izquierda y hacia la derecha usaré barra inclinada (/) y barra diagonal inversa (\).

Tomemos un cuadrado con las esquinas (x1) (11), donde x es cualquier cosa menos 1. Hay uno en la esquina superior izquierda. Supongamos que la inclinación en ese cuadrado es barra inclinada, que conecta dos 1's. Esos 1 están "agotados" y todos los cuadrados que los tocan deben tener líneas que no toquen los números. Pero eso lleva a una situación imposible porque tendríamos un corte a la izquierda y debajo de nuestro cuadrado, lo que significa que el 1 restante toca dos inclinaciones. La conclusión: si tiene un cuadrado con tres 1's, entonces la línea en ese cuadrado debe tocar la esquina que no es 1. Esta regla puede no aplicarse en los bordes y esquinas, pero si tiene un 1 en la esquina debe dibujar la línea tocando esa esquina.

Los números 1 y 3 son simétricos y usando una lógica similar obtenemos otra regla: si tiene un cuadrado con tres 3, entonces la línea en ese cuadrado debe tocar dos de esos tres 3.

Existen reglas más generales, pero no se aplican en las esquinas. Debe haber cuadrados alrededor del cuadrado en cuestión. Tomemos un cuadrado de dos oponentes (x1) (1y), donde xey son cualquier cosa, incluido un no-number. Hay uno de esos dos cuadrados desde la esquina inferior izquierda.Supongamos que la inclinación en ese cuadrado es barra inclinada, que conecta dos 1's. Esos 1 están "agotados" y todos los cuadrados que los tocan deben tener líneas que no toquen los números. Pero eso lleva a un bucle alrededor de los 1's. La conclusión: si tiene un cuadrado con dos 1 opuestos, entonces la línea en ese cuadrado no debe tocar esos dos 1. Esta regla puede no aplicarse en los bordes de la placa.

Los números 1 y 3 son simétricos, pero la regla anterior emplea la regla "sin bucles", y no hay regla simétrica "sin bucles de líneas laterales", y por lo tanto no hay regla que tenga dos 3 opuestos.

Ahora que sabe qué línea toca el 1, puede concluir que ninguna otra línea puede tocarlo. Podemos generalizar este razonamiento para seguir las siguientes reglas de llenado: si un número x toca x líneas, entonces todos los demás cuadrados vecinos tienen líneas que no tocan el número. Y simétricamente: si un número x es una esquina de (4-x) cuadrados con líneas que no tocan el número, entonces todos los demás cuadrados vecinos deben tener líneas que toquen el número.

Google buscando el término "Gokigen Naname" Encontré más reglas. Uno es aproximadamente dos 1 adyacentes (11), pero Mweerden ya lo cubrió.

Estas reglas no son suficientes para resolver el tablero. Hay otras reglas probablemente. Pero eventualmente el algoritmo puede tener que adivinar.

+0

No estoy convencido de que, en un buen acertijo, el algoritmo tenga que adivinar (en base a una cantidad razonable de experiencia, reproducir la versión de la colección de rompecabezas portátil de Simon Tatham - http://www.chiark.greenend.org.uk /~sgtatham/puzzles/java/slant.html) pero estoy de acuerdo. Se trata de encontrar los patrones que le dan información y luego agregar eso y luego encontrar más patrones. Si está haciendo conjeturas, entonces todavía no tiene suficientes patrones. :) – Chris

+0

El número de patrones puede ser tan grande que sería mejor adivinar que tener una gran base de datos de gigabytes. – Dialecticus

+0

Tiene razón en que hay momentos en los que simplemente probar una ruta de falla puede ser mejor, pero mi intuición/experiencia sugiere que este no es el caso. Ha pasado demasiado tiempo desde la última vez que jugué, así que no puedo recordar todas las reglas que tengo en mi cabeza para usar y poner aquí. Si no estuviera en el trabajo, comenzaría a jugar para recordarme a mí mismo. ;-) – Chris

2

"Lógicamente" es un término muy amplio. Como se menciona en los comentarios de Orbling, retroceder puede considerarse lógico. También se puede entender "lógicamente" que significa cómo resolverlo traduciéndolo a una fórmula lógica. De los comentarios que reúno, intentas implementar un solucionador, similar a quizás un solucionador de Sudoku común.

Una manera simple de implementar un solucionador, similar a una para Sudokus, es encontrar ciertos patrones. Para los acertijos generados por el programa al que se refiere, puedo decir con razonable confianza que esto debería ser suficiente para resolverlos sin adivinar ni retroceder.

Algunos ejemplos de patrones obvios son <11> y >33<. Especialmente 2 tiene algunas buenas propiedades "transitivas". Por ejemplo: <12...23 -> <12...23< (con 2 ... 2 una cantidad arbitraria de 2s). Pruebe su solución en varios ejemplos y cuando se quede atascado, estoy seguro de que ha encontrado un ejemplo que puede enseñarle otro patrón.

Cuestiones relacionadas