Calculez le 3BV d'une carte de démineur

17

Le 3BV d'un démineur conseil de représente le nombre minimum de clics gauche requis pour résoudre le conseil si vous connaissez déjà la solution. Il signifie "Bechtel's Board Benchmark Value". Voici son site l' expliquant.

Vous trouverez ci-dessous un tableau de démineur résolu. Les drapeaux indiquent les mines; les tuiles sans mines indiquent le nombre de mines adjacentes, y compris en diagonale, sauf que les tuiles qui devraient avoir "0" sont laissées vides à la place. L'image montre quelles tuiles doivent être cliquées pour résoudre le plateau.

Compter 3BV

Les clics comptabilisés pour le 3BV sont:

  • Un pour chaque zone inondée de tuiles vierges (zéro mines adjacentes) et leurs voisins non vierges.
  • Un pour chaque tuile non-mine.

Un autre exemple (3BV = 39)

Conseil de démineur résolu Clics requis


Étant donné un tableau 2D de valeurs, 0pour clear et 1pour une mine (ou un booléen), retournez le 3BV .

Les dimensions d'une carte seront d'au moins 8x8 et d'au plus 24x30, inclus. Votre programme doit gérer toutes les cartes possibles, pas seulement les exemples.

Remarque: Un plateau ne contiendra jamais que des mines.

Exemple d'E / S:

[[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
mbomb007
la source
Un tableau d'entiers est-il correct en entrée? Chaque entier code une ligne.
Karl Napf
@KarlNapf No. L'entrée doit être reconnaissable comme une carte, comme illustré.
mbomb007
Pourriez-vous fournir plus de cas de test, y compris éventuellement l'entrée basée sur les images affichées, et peut-être un cas de test de dimensions maximales?
miles

Réponses:

15

MATLAB, 92 90 86 83 79 74 72 octets

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

Cette solution accepte l'entrée sous la forme d'une matrice 2D de 0 et de 1 et affichera la valeur 3BV pour l'entrée fournie.

Voici une démo légèrement modifiée dans Octave pour ceux d'entre vous sans MATLAB.

Explication

La matrice d'entrée est dilatée à l'aide d'une matrice de 3 x 3 1puis inversée (en utilisant ~) qui identifie tous les points qui n'ont pas de mines comme voisins ( 1) ou do ( 0). Pour déterminer le nombre de régions connectées, nous utilisons bwlabelpour étiqueter chaque région connectée de 1. La première sortie est la matrice d'étiquettes ( 0où l'entrée était zéro et toute valeur dans la plage 1...Noù il y avait une 1dans l'entrée où Nest l'indice du groupe connecté auquel elle appartient). La deuxième sortie est le nombre de régions (le nombre de clics requis pour les ouvrir). Le résultat de la bwlabelfigure dans l'image de gauche.

entrez la description de l'image ici

Nous développons la première sortie de l' bwlabelutilisation imdilate(tous les non-zéros sont développés) en utilisant une matrice de 3 x 3 de 1. Le résultat est montré dans l'image au milieu.

Pour déterminer les clics restants, nous comptons ensuite les carrés qui ne se trouvent pas dans cette région développée ( ~imdilate()) et pas une mine ( -x) (carrés blancs dans l'image de droite) et ajoutons cela au nombre total de régions ouvertes (le nombre de différentes couleurs dans l'image de gauche) pour obtenir le 3BV.

Suever
la source
9

Octave, 86 84 79 66 octets

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

Cette solution crée une fonction anonyme nommée à anslaquelle on peut ensuite transmettre une matrice 2D de 0et1 ». La logique est la même que ma réponse MATLAB mais utilise quelques astuces qu'Octave a à offrir pour économiser de l'espace.

Cette solution nécessite que le imagepackage soit installé.

Démo ici

Suever
la source
2

MATL, 24 22 21 octets (non concurrent)

1 octet enregistré grâce à @Luis

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

Essayez-le sur MATL Online

Explication

Encore une fois, cela est similaire à mes réponses MATLAB et Octave à cette question.

        % 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 
Suever
la source
Pourquoi ne pas concurrencer?
CalculatorFeline
1
@CalculatorFeline Malheureusement, la bwlabelnfonctionnalité a été introduite dans MATL après la publication du défi.
Suever