Saltar al contenido

Calcular el 3BV de una Junta Buscaminas

Pedro, miembro de este equipo de trabajo, nos hizo el favor de redactar esta reseña porque controla perfectamente este tema.

Solución:

MATLAB, 929086837974 72 bytes

x=input('');[email protected](x)~imdilate(x,ones(3));[C,N]=bwlabel(I(x));nnz(I(C)-x)+N

Esta solución acepta la entrada en forma de matriz 2D de 0 y 1 y mostrará el valor 3BV para la entrada proporcionada.

Aquí hay una demostración ligeramente modificada en Octave para aquellos de ustedes que no tienen MATLAB.

Explicación

La matriz de entrada se dilata usando una matriz de 3 x 3 de 1‘s y luego invertida (usando ~) que identifica todos los puntos que no tienen minas como vecinos (1) o hacer (0). Para determinar el número de regiones conectadas, usamos bwlabel para etiquetar cada región conectada de 1‘s. La primera salida es la matriz de etiquetas (0 donde la entrada era cero y cualquier valor en el rango 1...N donde habia un 1 en la entrada donde N es el índice del grupo conexo al que pertenece). El segundo resultado es el número de regiones (el número de clics necesarios para abrirlas). el resultado de la bwlabel se muestra en la imagen de la izquierda.

ingrese la descripción de la imagen aquí

Ampliamos la primera salida de bwlabel usando imdilate (todos los distintos de cero se expanden) usando una matriz de 3 x 3 de 1‘s. El resultado se muestra en la imagen del medio.

Para determinar los clics restantes, contamos los cuadrados que no están en esta región expandida (~imdilate()) y no una mina (-x) (cuadrados blancos en la imagen de la derecha) y suma esto al número total de regiones abiertas (el número de colores diferentes en la imagen de la izquierda) para obtener el 3BV.

Octava, 868479 66 bytes

@(x)nnz(~imdilate(c=imerode(~x,o=ones(3)),o)-x)+max(bwlabel(c)(:))

Esta solución crea una función anónima llamada ans que luego se puede pasar una matriz 2D de 0‘arena 1‘s. La lógica es la misma que mi respuesta de MATLAB, pero usa algunos trucos que Octave tiene para ofrecer para ahorrar espacio.

Esta solución requiere que el image el paquete está instalado.

demostración aquí

MATL, 2422 21 bytes (no competitivo)

1 byte guardado gracias a @Luis

4Y6Z+~l2#ZIw7MZ+G+~z+

Pruébelo en MATL Online

Explicación

Nuevamente, esto es similar a mis respuestas de MATLAB y Octave a esta pregunta.

        % Implicitly grab input array
4Y6     % Push the literal [1 1 1; 1 1 1; 1 1 1] to the stack
Z+      % Perform 2D convolution of the input with this array
~       % Negate the result
l2#ZI   % Call bwlabeln which dilates each open region and the second output
        % returns the number of open regions
w       % Flip the top two stack elements
7M      % Push the literal [1 1 1; 1 1 1; 1 1 1] to the stack again
Z+      % Perform 2D convolution
G+      % Explicitly grab the input and add it to the result
~z      % Count the number of 0's in the result (the remaining number of clicks)
+       % Add the total number of remaining clicks to the number of open regions 

Agradecemos que quieras favorecer nuestra labor añadiendo un comentario o dejando una puntuación te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *