Calcola il 3BV di una scheda per dragamine


17

Il 3BV di una scheda Minesweeper rappresenta il numero minimo di clic a sinistra necessari per risolvere la scheda se si conosce già la soluzione. È l'acronimo di "Bechtel's Board Benchmark Value". Ecco il suo sito che lo spiega.

Di seguito è riportata una scheda Minesweeper risolta. Le bandiere indicano mine; le tessere senza mine indicano il conteggio delle mine adiacenti, anche in diagonale, ad eccezione del fatto che le tessere che dovrebbero avere "0" vengono invece lasciate vuote. L'immagine mostra quali tessere devono essere cliccate per risolvere il tabellone.

Conteggio 3BV

I clic conteggiati per il 3BV sono:

  • Uno per ogni area piena di inondazioni di tessere vuote (zero miniere adiacenti) e dei loro vicini non vuoti.
  • Uno per l'altro non-mine.

Un altro esempio (3BV = 39)

Risolto il consiglio del dragamine Clic richiesti


Dato un array 2D di valori, 0per clear e 1per una miniera (o un booleano), restituisce il 3BV .

Le dimensioni di una tavola saranno almeno 8x8 e al massimo 24x30 incluse. Il tuo programma dovrebbe gestire tutte le possibili schede, non solo gli esempi.

Nota: una tavola non conterrà mai solo mine.

Esempio I / O:

[[0,0,0,0,0,0,0,0],
[0,0,0,1,0,0,0,0],
[0,0,0,1,0,0,1,0],
[0,1,0,0,1,0,0,0],
[0,0,1,0,0,0,0,1],
[0,0,0,1,0,0,0,0],
[0,0,0,0,0,0,1,0],
[0,0,0,0,0,0,0,1]]

23

[[0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0],
[0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,1,0,1,1,0,0,0,0,0,0],
[0,1,0,0,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,1,0,0,0,1,0,1,0,1,0],
[0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0],
[0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0],
[0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1,0,1],
[0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1],
[0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0],
[0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0],
[0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0],
[1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1],
[0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,1,0,0,0,0,1,1,0,0],
[0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,0,1,1,0,0,0,1,0,0,0,1,1,0,0],
[0,1,1,1,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0],
[0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0],
[0,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0]]

187

Un array di numeri interi va bene come input? Ogni numero intero codifica una riga.
Karl Napf,

@KarlNapf No. L'ingresso deve essere riconoscibile come una scheda, come mostrato.
mbomb007,

Potresti fornire più casi di test, possibilmente includendo l'input basato sulle immagini visualizzate e forse un caso di test di dimensioni massime?
miglia

Risposte:


15

MATLAB, 92 90 86 83 79 74 72 byte

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

Questa soluzione accetta l'input sotto forma di una matrice 2D di 0 e 1 e visualizzerà il valore 3BV per l'input fornito.

Ecco una demo leggermente modificata in Octave per quelli di voi senza MATLAB.

Spiegazione

La matrice di input viene dilatata usando una matrice 3 x 3 di 1's e quindi invertita (usando ~) che identifica tutti i punti che non hanno mine come vicini ( 1) o do ( 0). Per determinare il numero di regioni connesse, usiamo bwlabelper etichettare ciascuna regione connessa di 1's. Il primo output è la matrice dell'etichetta ( 0dove l'input era zero e qualsiasi valore nell'intervallo in 1...Ncui era presente un 1input in cui Nè l'indice del gruppo collegato a cui appartiene). Il secondo output è il numero di regioni (il numero di clic necessari per aprirle). Il risultato di bwlabelè mostrato nell'immagine a sinistra.

inserisci qui la descrizione dell'immagine

Espandiamo il primo output di bwlabelutilizzo imdilate(tutti i non zeri vengono espansi) usando una matrice 3 x 3 di 1. Il risultato è mostrato nell'immagine al centro.

Per determinare i clic rimanenti, contiamo quindi i quadrati che non si trovano in questa regione espansa ( ~imdilate()) e non una miniera ( -x) (quadrati bianchi nell'immagine a destra) e aggiungiamo questo al numero totale di regioni aperte (il numero di colori diversi nell'immagine a sinistra) per ottenere il 3BV.


9

Ottava, 86 84 79 66 byte

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

Questa soluzione crea una funzione anonima chiamata ansche possono poi essere passata una matrice 2D di 0's e 1' s. La logica è la stessa come la mia risposta MATLAB ma utilizza alcuni trucchi che Octave ha da offrire per risparmiare spazio.

Questa soluzione richiede l' imageinstallazione del pacchetto.

Demo qui


2

MATL, 24 22 21 byte (non concorrenti)

1 byte salvato grazie a @Luis

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

Provalo su MATL Online

Spiegazione

Ancora una volta, questo è simile ai miei MATLAB e Octave risposte a questa domanda.

        % 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 

Noncompeting perché?
CalculatorFeline

1
@CalculatorFeline Purtroppo la bwlabelnfunzionalità è stata introdotta per MATL dopo la sfida è stata pubblicata.
Suever
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.