Beregn 3BV for et Minesveiper Board

3BV for en Minesveiper -tavle representerer det minste antallet venstre klikk som kreves for å løse tavlen hvis du allerede kjenner løsningen. Det står for » Bechtels Board Benchmark Value «. Her «s hans nettsted som forklarer det.

Nedenfor er et løst Minesveiper-bord. Flaggene indikerer gruver; fliser uten gruver angir antallet tilstøtende miner, inkludert diagonalt, bortsett fra at fliser som skal ha » 0 «, blir stående tomme. Bildet viser hvilke fliser som må klikkes for å løse brettet.

Teller 3BV

Klikk som telles mot 3BV er:

  • Én for hvert flomfylte område blanke fliser (null miner ved siden av) og deres ikke-blanke naboer.
  • En for hverandre, ikke-minefliser.

Et annet eksempel (3BV = 39)

Løst minesveiperbrett Krevde klikk


Gitt et 2D-utvalg av verdier, 0 for klar og 1 for en gruve (eller en boolsk), returnerer 3BV .

Dimensjoner på et kort vil være minst 8×8 og maksimalt 2 4×30, inkludert. Programmet ditt skal håndtere alle mulige tavler, ikke bare eksemplene.

Merk: Et tavle inneholder aldri bare miner.

Eksempel 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 

Kommentarer

  • Er en rekke heltall ok som input? Hvert heltall koder en rad.
  • @KarlNapf No. Inngangene skal kunne gjenkjennes som et kort som vist.
  • Kan du gi flere testtilfeller, muligens inkludert inndata basert på det viste bilder, og kanskje et testmål med maks dimensjoner?

Svar

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 

Denne løsningen aksepterer inngangen i form av en 2D-matrise på 0 «s og 1» s og viser 3BV-verdien for den angitte inngangen.

Her er litt modifisert demo i Oktav for de av dere uten MATLAB.

Forklaring

Inngangsmatrisen utvides med en 3 x 3 matrise av 1 «s og deretter inverteres (ved hjelp av ~) som identifiserer alle punktene som ikke har miner som naboer (1) eller gjør (). For å bestemme antall tilkoblede regioner bruker vi bwlabel til å merke hver tilkoblede region av 1 «s. Den første utgangen er etikettmatrisen (0 der inngangen var null og en hvilken som helst verdi i området 1...N der det var en 1 i inngangen der N er indeksen til den tilkoblede gruppen den tilhører). Den andre utgangen er antall regioner (antall klikk som kreves for å åpne dem). Resultatet av bwlabel vises på bildet til venstre.

skriv inn bildebeskrivelse her

Vi utvider den første utgangen av bwlabel ved hjelp av imdilate (alle ikke-nuller utvides) ved hjelp av en 3 x 3 matrise av 1 «s. Resultatet vises på bildet i midten.

For å bestemme de gjenværende klikkene teller vi deretter rutene som ikke er i dette utvidede området (~imdilate()) og ikke en gruve (-x) (hvite firkanter i bildet til høyre) og legg dette til totalt antall åpne regioner (antall forskjellige farger i bildet til venstre ) for å få 3BV.

Svar

Oktav, 86 84 79 66 byte

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

Denne løsningen oppretter en anonym funksjon med navnet ans kan deretter sendes en 2D-matrise med 0 «s og 1» s. Logikken er den samme som MATLAB-svaret mitt, men bruker noen triks som Octave har å tilby for å spare plass.

Denne løsningen krever at image -pakken er installert .

Demo her

Svar

MATL, 24 22 21 byte (ikke-konkurrerende )

1 byte lagret takket være @Luis

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

Prøv det på MATL Online

Forklaring

Igjen, dette ligner på MATLAB og Octave svar på dette spørsmålet.

 % 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 

Kommentarer

  • Ikke-konkurrerende hvorfor?
  • @CalculatorFeline Dessverre ble bwlabeln -funksjonaliteten introdusert til MATL etter utfordring ble lagt ut.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *