Introducción
Hay un pequeño pueblo con pocas casas y campos vacíos. Los burócratas locales quieren dividir el pueblo en lotes para que cada lote contenga exactamente una casa, y los bordes de los lotes formen una bonita cuadrícula en línea recta. Su tarea es determinar si esto es posible.
La tarea
Su entrada es una matriz rectangular 2D de bits; 1 representa una casa y 0 un campo vacío. Su tamaño será de al menos 1 × 1 , y contendrá al menos uno 1. Puede tomar la entrada en cualquier formato razonable (lista anidada de enteros, lista de cadenas, cadena multilínea, etc.).
Su programa determinará si la matriz se puede dividir en celdas de cuadrícula utilizando líneas horizontales y verticales rectas para que cada celda de cuadrícula contenga exactamente uno 1. Las celdas de cuadrícula pueden tener diferentes tamaños y formas, aunque siempre serán rectangulares. Las líneas deben correr desde un borde de la matriz hasta el borde opuesto.
Por ejemplo, la siguiente es una división válida de una matriz:
00|0010|01|1
01|0000|00|0
--+----+--+-
00|0000|00|1
01|0010|01|0
--+----+--+-
01|1000|10|1
mientras que la siguiente división no es válida, ya que hay celdas de cuadrícula sin 1 o más de un 1:
00|0010|01|1
--+----+--+-
01|0000|00|0
00|0000|00|1
01|0010|01|0
--+----+--+-
00|1000|10|1
Si existe una división válida, deberá generar un valor verdadero y, de lo contrario, un valor falso.
Reglas y puntaje
Puede escribir un programa completo o una función. El conteo de bytes más bajo gana.
Casos de prueba
[[1]] -> True
[[0,1],[1,0]] -> True
[[1,1],[1,0]] -> False
[[1,0,1],[0,1,0]] -> True
[[1,0],[0,1],[0,1]] -> True
[[1,0,0],[0,0,1],[0,1,1]] -> True
[[1,1,1],[1,1,1],[1,1,1]] -> True
[[1,0,1],[0,1,0],[1,0,0]] -> True
[[1,0,0],[1,0,0],[0,1,1]] -> False
[[0,0,0,0,1],[1,0,0,1,0],[0,0,0,1,0]] -> False
[[0,0,1,0,1],[0,0,0,1,0],[0,0,0,0,0]] -> True
[[1,1,0,0,0],[0,0,0,0,0],[1,0,1,0,0]] -> True
[[1,1,0,1,1],[0,1,0,1,1],[1,0,0,0,0]] -> True
[[0,0,0,0,0,0,0],[0,1,1,1,0,1,0],[0,1,0,0,1,0,0],[0,0,0,0,0,0,1],[0,0,1,0,0,0,1],[1,1,0,1,1,0,0]] -> False
[[1,1,0,0,0,0,0],[1,0,1,1,0,1,0],[0,0,0,0,1,0,0],[0,1,0,1,1,0,0],[1,0,0,0,1,1,0],[0,0,0,0,0,1,0]] -> False
[[0,1,0,1,1,1,0],[0,0,0,0,1,0,0],[0,0,0,0,0,0,0],[1,0,0,1,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,1]] -> True
[[0,1,0,0,1,0,1],[1,0,0,0,1,0,1],[0,0,1,0,1,0,1],[1,0,0,0,1,1,0],[0,0,0,1,1,1,0],[0,1,0,0,1,0,1]] -> True
[[0,1,0,0,1,0,0,1,0],[0,0,0,0,1,1,0,1,0],[1,1,0,0,1,0,0,0,0],[0,0,1,0,1,0,1,0,0],[0,0,1,0,1,0,1,0,0],[0,1,0,0,0,1,0,0,1],[0,1,0,0,0,0,1,0,0]] -> False
[[1,0,1,0,0,1,1,0,1],[0,1,1,0,0,1,1,0,1],[1,0,0,0,0,1,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,1,0,0,0,0,1,1],[0,1,1,0,1,0,1,0,1],[1,0,1,0,0,1,1,0,1]] -> True
[[1, 0, 1], [0, 1, 0], [1, 0, 0]]
esa era la única matriz 3x3 por la que fallaba mi nuevo enfoque.Respuestas:
Pyth,
3029262423 bytesPruébalo en línea.
Estoy seguro de que esto se acortará. Esto es O (2 mn ) , donde m y n son la anchura y la altura de la matriz, pero completa los dos últimos casos de prueba en 45 segundos en mi portátil en la batería (i5-5200U con rendimiento limitado).
Emite el número de soluciones.
Explicación
Es muy divertido trabajar con matrices de cinco dimensiones. </sarcasm> Se supone que no debes entender cómo funciona esto incluso con la explicación.
fuente
Jalea , 22 bytes
Pruébalo en línea!
fuente
Haskell , 116 bytes
Pruébalo en línea!
fuente
mergerows
am
.[[1,0],[0,1],[1,0]]
. El problema es que un colapso codicioso puede obstaculizar un colapso posterior mejor.[[1,1],[1,0]]
colapso obstruye falsamente la[[1],[1],[1]]
solución. Déjame dormir sobre esto o ¿debería eliminarlo?Jalea , 20 bytes
Esta sigue siendo una solución de fuerza bruta, pero es bastante más rápida que mi otra respuesta, que no puede hacer frente a los dos últimos casos de prueba en TIO, y maneja todos los casos de prueba en ~ 4 segundos.
Pruébalo en línea!
Cómo funciona
fuente