Oblicz 3BV deski Saper

3BV Saper przedstawia minimalną liczbę kliknięć lewym przyciskiem potrzebną do rozwiązania planszy, jeśli znasz już rozwiązanie. To oznacza ” Bechtel „s Board Benchmark Value „. Tutaj” s jego strona wyjaśniająca to.

Poniżej znajduje się rozwiązana plansza Saper. Flagi wskazują miny; kafelki bez min wskazują liczbę sąsiadujących min, w tym po przekątnej, z tym wyjątkiem, że kafelki, które powinny mieć ” 0 „, są zamiast tego puste. Obraz pokazuje, które płytki należy kliknąć, aby rozwiązać planszę.

Liczenie 3BV

Kliknięcia zaliczane do 3BV to:

  • Po jednym na każdy zalany obszar pustych kafelków (zero sąsiadujących min) i ich niepustych sąsiadów.
  • Jeden dla siebie kafelek inny niż mój.

Inny przykład (3BV = 39)

Rozwiązana plansza Saper Wymagane kliknięcia


Biorąc pod uwagę tablicę wartości 2D, 0 for clear i 1 dla miny (lub boolean), zwróć 3BV .

Tablica ma wymiary co najmniej 8×8, a najwyżej 2 4×30 włącznie. Twój program powinien obsługiwać wszystkie możliwe tablice, a nie tylko przykłady.

Uwaga: tablica nigdy nie będzie zawierała tylko min.

Przykładowe 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 

Komentarze

  • Czy tablica liczb całkowitych jest w porządku jako dane wejściowe? Każda liczba całkowita koduje jeden wiersz.
  • @KarlNapf Nie. Dane wejściowe powinny być rozpoznawalne jako tablica, jak pokazano.
  • Czy możesz podać więcej przypadków testowych, prawdopodobnie włączając dane wejściowe oparte na wyświetlanym obrazy, a może przypadek testowy maksymalnych wymiarów?

Odpowiedź

MATLAB, 92 90 86 83 79 74 72 bajty

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

To rozwiązanie akceptuje dane wejściowe w postaci macierzy 2D o wymiarach 0 „si 1” si wyświetli wartość 3BV dla podanego wejścia.

Oto nieco zmodyfikowane demo w Octave dla tych z Was, którzy nie korzystają z MATLAB-a.

Wyjaśnienie

Macierz wejściowa jest rozszerzana za pomocą macierzy 3 x 3 1 „s, a następnie odwracana (przy użyciu ~), który identyfikuje wszystkie punkty, które nie mają min, jako sąsiadów (1) lub do (). Aby określić liczbę połączonych regionów, używamy bwlabel do oznaczenia każdego połączonego regionu 1 „. Pierwszym wynikiem jest macierz etykiet (0 gdzie wartość wejściowa wynosiła zero i dowolna wartość z zakresu 1...N, gdzie występuje 1 na wejściu, gdzie N jest indeksem połączonej grupy, do której należy). Drugim wynikiem jest liczba regionów (liczba kliknięć potrzebna do ich otwarcia). Wynik bwlabel jest pokazany na obrazku po lewej stronie.

tutaj wprowadź opis obrazu

Rozwijamy pierwsze wyjście bwlabel za pomocą imdilate (wszystkie niezerowe są interpretowane) przy użyciu macierzy 3 x 3 1 „s. Wynik jest pokazany na obrazku pośrodku.

Aby określić pozostałe kliknięcia, liczymy następnie kwadraty, które nie znajdują się w tym rozwiniętym regionie (~imdilate()) a nie minę (-x) (białe kwadraty na obrazku po prawej stronie) i dodaj to do całkowitej liczby otwartych obszarów (liczba różnych kolorów na obrazku po lewej ), aby uzyskać 3BV.

Odpowiedź

Octave, 86 84 79 66 bajtów

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

To rozwiązanie tworzy anonimową funkcję o nazwie ans, która można następnie przekazać macierz 2D 0 „s i 1” s. Logika jest taka sama jak moja odpowiedź MATLAB, ale wykorzystuje kilka sztuczek, które Octave ma do zaoferowania, aby zaoszczędzić miejsce.

To rozwiązanie wymaga zainstalowania pakietu image .

Demo tutaj

Odpowiedź

MATL, 24 22 21 bajtów (niekonkurujące )

1 bajt zapisany dzięki @Luis

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

Wypróbuj na MATL Online

Wyjaśnienie

Ponownie, jest to podobne do moich odpowiedzi w MATLAB-ie i Octave na to pytanie.

 % 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 

Komentarze

  • Brak konkurencji, dlaczego?
  • @CalculatorFeline Niestety funkcja bwlabeln została wprowadzona do MATL po wyzwanie zostało wysłane.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *