Bereken de 3BV van een mijnenvegerbord

De 3BV van een Mijnenveger bord geeft het minimum aantal links klikken aan dat nodig is om het bord op te lossen als je de oplossing al kent. Het staat voor ” Bechtel “s Board Benchmark Value “. Hier” s zijn site waarin het wordt uitgelegd.

Hieronder staat een opgelost Mijnenveger-bord. De vlaggen geven mijnen aan; tegels zonder mijnen geven het aantal aangrenzende mijnen aan, ook diagonaal, behalve dat tegels die ” 0 ” zouden moeten hebben, leeg worden gelaten. De afbeelding laat zien op welke tegels moet worden geklikt om het bord op te lossen.

3BV tellen

Klikken geteld voor de 3BV zijn:

  • Eén voor elk met overstromingen gevuld gebied met lege tegels (nul mijnen aangrenzend) en hun niet-lege buren.
  • Eén voor elkaar niet-mijntegel.

Nog een voorbeeld (3BV = 39)

Opgelost mijnenvegerbord Klikken vereist


Gegeven een 2D-array met waarden, 0 voor clear en 1 voor een mijn (of een boolean), retourneren de 3BV .

De afmetingen van een bord zijn minimaal 8×8 en maximaal 2 4×30, inclusief. Je programma moet alle mogelijke borden behandelen, niet alleen de voorbeelden.

Opmerking: een bord zal nooit alleen mijnen bevatten.

Voorbeeld 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 

Reacties

  • Is een array van gehele getallen ok als invoer? Elk geheel getal codeert één rij.
  • @KarlNapf Nee. De invoer moet herkenbaar zijn als een bord, zoals weergegeven.
  • Kunt u meer testcases opgeven, mogelijk inclusief de invoer op basis van de weergegeven afbeeldingen, en misschien een testcase met maximale afmetingen?

Antwoord

MATLAB, 92 90 86 83 79 74 72 bytes

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

Deze oplossing accepteert de invoer in de vorm van een 2D-matrix van 0 “s en 1” s en geeft de 3BV-waarde weer voor de opgegeven invoer.

Hier is een licht gewijzigde demo in Octave voor degenen onder u zonder MATLAB.

Uitleg

De invoermatrix wordt gedilateerd met een 3 x 3 matrix van 1 “s en vervolgens omgekeerd (met ~) die alle punten identificeert die geen mijnen hebben als buren (1) of doe (). Om het aantal verbonden regios te bepalen, gebruiken we bwlabel om elke verbonden regio van 1 “s te labelen. De eerste uitvoer is de labelmatrix (0 waarbij de invoer nul was en een willekeurige waarde in het bereik 1...N waar een 1 in de invoer waar N de index is van de verbonden groep waartoe het behoort). De tweede uitvoer is het aantal regios (het aantal klikken dat nodig is om ze te openen). Het resultaat van de bwlabel wordt weergegeven in de afbeelding aan de linkerkant.

voer de beschrijving van de afbeelding hier in

We breiden de eerste uitvoer van bwlabel uit met imdilate (alle niet-nullen worden uitgebreid) met een 3 x 3 matrix van 1 “s. Het resultaat wordt weergegeven in de afbeelding in het midden.

Om de resterende klikken te bepalen, tellen we de vierkanten die niet in dit uitgevouwen gebied staan (~imdilate()) en niet een mijn (-x) (witte vierkantjes in de afbeelding aan de rechterkant) en voeg dit toe aan het totale aantal open gebieden (het aantal verschillende kleuren in de afbeelding aan de linkerkant ) om de 3BV te krijgen.

Answer

Octave, 86 84 79 66 bytes

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

Deze oplossing creëert een anonieme functie met de naam ans die kan dan een 2D-matrix van 0 “s en 1” s worden doorgegeven. De logica is hetzelfde als mijn MATLAB-antwoord, maar gebruikt een paar trucs die Octave te bieden heeft om ruimte te besparen.

Deze oplossing vereist dat het image -pakket is geïnstalleerd .

Demo hier

Antwoord

MATL, 24 22 21 bytes (niet-concurrerend )

1 byte opgeslagen dankzij @Luis

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

Probeer het op MATL Online

Uitleg

Nogmaals, dit is vergelijkbaar met mijn MATLAB- en Octave-antwoorden op deze vraag.

 % 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 

Reacties

  • Niet-concurrerend waarom?
  • @CalculatorFeline Helaas is de bwlabeln -functionaliteit geïntroduceerd in MATL na de uitdaging geplaatst.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *