¿Pueden estos rectángulos llenar un espacio rectangular?
Dado un montón de rectángulos, se le pregunta si se pueden organizar o no para llenar un espacio rectangular.
Especificaciones
Dado un montón de m x n
rectángulos arbitrarios ; 0 <= m, n <= 1000
, determine si es posible o no organizarlos de modo que cubran exactamente un área rectangular sin agujeros ni superposiciones. Los rectángulos no se pueden girar, y cada rectángulo solo se puede colocar una vez.
Entrada
La entrada para esto es muy flexible, siempre que la entrada proporcione algún tipo de lista de dimensiones de 2 espacios. Por ejemplo, los dos siguientes son válidos:
Separado por espacio, retorno
1 2
1 5
4 5
3 6
Lista de dimensiones
[[1, 2], [1, 5], [4, 5], [3, 6]]
Salida
Cualquier tipo de valores verdadero / falso como verdadero / falso, 0/1, T / F, Verdadero / Falso, etc. Si va a utilizar un método de salida que no sea muy obvio, especifique en su respuesta.
Ejemplos
Caso de prueba 1
Entrada:
1 1
1 5
2 6
Salida:
true
(o algo similar)
Cómo organizarlo:
XYYYYY
ZZZZZZ
ZZZZZZ
Caso de prueba 2
Entrada:
1 1
2 2
Salida:
false
(o algo similar)
Explicación: Resulta obvio que no puede organizar dos cuadrados de diferentes tamaños y alinear sus bordes.
Caso de prueba 3
Entrada:
1 1
1 2
1 2
2 1
2 1
Salida:
true
(o algo similar) Cómo organizarlo:
AAB
DEB
DCC
Como señaló @ETHProductions, para todos los demás casos de prueba, puede seguir combinando rectángulos con una longitud de borde común hasta que tenga solo un rectángulo, por lo que este caso de prueba es solo para romper cualquier código que use esta idea.
Caso de prueba 4
Entrada:
3 2
4 1
2 1
4 1
2 1
5 2
3 2
1 4
3 2
2 1
2 1
1 1
5 1
Salida:
true
(o algo similar)
Cómo organizarlo:
AAABBBBEE
AAACCDDDD
FFFFFGGGH
FFFFFGGGH
IIIJJKKLH
IIIMMMMMH
Nota : No necesita indicar cómo organizarlo, solo necesita determinar si no se puede organizar.
Este es el código de golf, por lo que gana la respuesta más corta en bytes. Aceptaré la respuesta más corta a partir del 14 de enero, ¡pero siéntase libre de enviar respuestas más tarde ya que todavía puedo dar votos a favor! :)
¡Feliz golf!
~ AL
PD: Si sabe qué etiqueta debe aplicarse a este problema, agréguela, no tengo absolutamente ninguna idea de qué poner como etiqueta, aparte de code-golf.
EDITAR : Su programa debería poder procesar hasta 25 rectángulos, en un máximo de 10 segundos en una computadora decente (seré bastante flexible en esta regla).
EDITAR : he extendido el plazo de aceptación de envío hasta el último día del año, pero dudo que obtenga una respuesta para entonces ...
EDITAR : he extendido el plazo de aceptación de envío en 2 semanas, por lo que si no hay más respuestas para entonces, ¡se aceptará la respuesta C actual! :)
fuente
[[1, 2], [2, 1], [1, 1], [1, 2], [2, 1]]
(que se puede arreglarABB ACD EED
). Es posible que desee agregar este caso de prueba simple.Respuestas:
C, 1135
115812311598bytesBueno, ya pasó la fecha límite establecida, pero viendo que todavía no hay respuestas, aquí hay una (un poco larga) en C.
Devoluciones:
Actualizar:
El código original podría atascarse en algunas matrices, tomando mucho más tiempo que los 10 permitidos. La revisión actual debe completar todas las matrices en menos de 1s. Esto se logra al 1) Ordenar los rectángulos de entrada y 2) omitir los tamaños repetidos al ajustar.
Golfizado:
Sin golf:
Explicación: Tenemos 6 funciones:
main
,O
,Q
,F
,L
yT
.T
t EST para ver si hay espacio para el rectángulo en un punto dado.L
fil l es un rectángulo en el búfer de salida o, alternativamente elimina uno, sobreescribiendo.O
yQ
construir las paredes izquierda y superior, respectivamente, yF
f Males el resto del rectángulo de búsqueda iterativa.Aunque la búsqueda básica es iterativa, eliminamos la gran mayoría de los posibles vectores de búsqueda, primero mediante la construcción de las combinaciones permitidas de ancho y alto para el rectángulo maestro y luego eliminando las configuraciones imposibles. Se podría ganar velocidad adicional en rectángulos más grandes determinando las paredes inferiores y derechas antes de llenar el centro, pero no se requiere una velocidad decente cuando se limita a 25 rectángulos interiores.
fuente
Haskell, 226 bytes
Pruébalo en Ideone
Cómo funciona
Esto busca recursivamente todas las inclinaciones parciales cuya forma es un diagrama de Young , agregando un rectángulo a la vez, y verifica si alguno de los resultados finales son rectángulos.
Para ver que cualquier mosaico de un rectángulo se puede construir de esta manera: en cualquier mosaico de un diagrama de Young no vacío, sea R el conjunto de rectángulos en el mosaico cuya esquina suroeste no toca ningún otro rectángulo. Dado que cada vértice cóncavo del diagrama de Young es adyacente al borde (no simplemente adyacente a la esquina) como máximo a un rectángulo en R, y el número de estos vértices cóncavos es uno menos que el número de rectángulos en R, debe haber al menos un rectángulo en R que está adyacente al borde de ninguno de estos vértices cóncavos. Eliminarlo produce otro diagrama de Young, por lo que podemos proceder por inducción.
fuente