Imagine el siguiente escenario: está jugando acorazados con un amigo pero decide hacer trampa. En lugar de mover un barco después de que él dispara donde solía estar tu barco, decides no colocar ningún barco en absoluto. Le dices que todos sus disparos son fallidos, hasta que es imposible colocar naves de esa manera.
Tienes que escribir una función, o un programa completo, que de alguna manera tome 3 argumentos: el tamaño del campo, una lista de cantidades de tamaños de barcos y una lista de disparos.
Campo de batalla
Uno de los parámetros dados es el tamaño del tablero. El campo de batalla es un cuadrado de celdas, y el parámetro dado es simplemente un lado del cuadrado.
Por ejemplo, la siguiente es una tabla de tamaño 5.
Las coordenadas en el campo se especifican como una cadena de 2 componentes: una letra seguida de un número. Puede confiar en que las letras están en algún caso particular.
La letra especifica la columna, el número especifica la fila de la celda (1 indexado). Por ejemplo, en la imagen de arriba, la celda resaltada se denota por "D2"
.
Como solo hay 26 letras, el campo no puede ser mayor que 26x26.
Barcos
Las naves son líneas rectas de 1 o más bloques. La cantidad de naves se especifica en una lista, donde el primer elemento es la cantidad de naves de 1 celda, la segunda de naves de 2 celdas, etc.
Por ejemplo, la lista [4,1,2,0,1]
crearía el siguiente paquete de envío:
Cuando se colocan en el campo de batalla, las naves no pueden cruzarse, ni siquiera tocarse entre sí. Ni siquiera con esquinas. Sin embargo, pueden tocar los bordes del campo.
A continuación puede ver un ejemplo de colocación de barco válida:
Puede suponer que para un conjunto de barcos determinado, siempre existe una ubicación en un tablero vacío de un tamaño determinado.
Salida
Si existen tales ubicaciones de naves, debe generar cualquiera de ellas.
El programa tiene que generar una matriz separada por una nueva línea de caracteres ascii de cualquiera de los 3 tipos: uno para denotar una celda en blanco, uno - una pieza de envío y uno - una celda marcada como "perdida". No se deben mostrar otros caracteres.
Por ejemplo,
ZZ@Z
\@@Z
@\\Z
\Z\\
(En este ejemplo, definí @
ser una celda en blanco, \
una celda "perdida" y Z
ser una pieza de envío)
Si no existe tal ubicación, el programa / función debería regresar sin generar nada.
Entrada
Si decide hacer un programa completo, depende de usted especificar cómo se ingresan las listas, algunas pueden ser a través de argumentos, otras a través de stdin.
Este es el código de golf , gana la menor cantidad de personajes.
Una solución optimizada ejemplo no golfed-se puede encontrar aquí
compilar con -std=c99
, el primer argumento es el tamaño de la tabla, los otros argumentos son los tamaños de buques. Se proporciona una lista de disparos separada por nueva línea en stdin. Ejemplo:
./a 4 1 1 1 <<< $'A2\nA4\nB3\nC3\nC4\D4'
10x10
con un conjunto de 4,3,2,1
barcos
26x26
? Dibujé una solución basada en expresiones regulares y recursividad, y se vuelve extremadamente lenta = inutilizable para campos más que6x6
. O hago algo muy estúpido o la falta de respuestas significa que otros tampoco tienen éxito.