Los cubos pueden estar hechos de seis cuadrados como lados. Pero también puedes doblar tres rectángulos de 2x1 por la mitad y pegarlos para formar un cubo. Ahora, en este desafío, obtienes un conjunto de piezas que están hechas de cuadrados, y debes determinar si puedes elegir piezas para formar un cubo unitario. No todas las piezas tienen que usarse, puede que queden algunas.
Detalles
Las piezas se dan como una cadena de dos caracteres diferentes o una imagen en blanco y negro o cualquier formato de ráster 2D conveniente. A continuación, supongo que los píxeles que forman las piezas son negros y el fondo es blanco.
Se considera que dos píxeles que comparten un lado pertenecen a la misma pieza. Las piezas solo se pueden plegar a lo largo de las líneas de la cuadrícula que separan los píxeles, y no se pueden cortar. Cada lado del cubo tiene el tamaño de un píxel, y cada lado del cubo solo puede estar hecho de una sola capa.
El resultado debe ser verdadero o falso. valor .
Casos de prueba
A continuación, los espacios son símbolos de fondo y hash
#
representan las piezas.
(más por agregar)
Válido
##
##
##
#
####
#
# # # # # # #
# ##
## #
Inválido
###
###
# #
####
### ## ####
Ejecute el siguiente fragmento para obtener más casos de prueba.
PD: Esta es una generalización de este desafío.
Respuestas:
C,
824803bytesPruébalo en línea!
... y antes de explicar esto en detalle, vale la pena una descripción general de alto nivel.
Resumen Básico
Este algoritmo aplica un patrón de comparación para clasificar cada poliomino que encuentra con un patrón dado como su subconjunto. A medida que los polyominoes coinciden, están "sin marcar", excluyéndolos de la coincidencia de patrones nuevamente. La clasificación inicial dada por el comparador es simplemente un recuento del número de mosaicos en el poliomino.
El emparejador se aplica primero para eliminar todos los poliominós que no se pueden plegar en un cubo; Se descarta la clasificación de estos poliominos. La coincidencia tiene éxito si estos poliominós aparecen dentro de los de nivel superior; por lo tanto, solo nos importa el subconjunto más pequeño de "desplegable" para cada clase. Aquí, junto con las codificaciones acolchadas, se muestran todos esos poliominós (excepto sus reflejos verticales). La codificación utiliza los bits 4-0 de cada carácter para representar cuadrados en cada fila:
Una vez que se eliminan estos poliominós, clasificamos los poliominós restantes en categorías relevantes. Vale la pena señalar que en casi todos los casos, uno solo puede encontrar poliominoes que permanecen (aquellos plegables en cubos) y simplemente buscar sumas de seis. Hay dos excepciones:
Para poder acomodar esta restricción, formamos 8 categorías, desde AH: A para monominoes (fichas solitarias), B para dominó, C para trominoes de esquina, D para trominoes de línea, E para tetrominoes de línea, F para otros tetrominoes, G para pentominoes y H para hexominoes. Todo lo que no cae en una de estas categorías se ignora. Contar los poliominoes que caen en cada categoría es suficiente.
Al final, solo devolvemos la veracidad o falsedad basada en una ecuación gigante y estas tabulaciones.
Ungolfed con comentarios
fuente