Wyobraźmy sobie, że mamy macierz bitów (która zawiera co najmniej jeden 1
):
0 1 0 1 1 0 1 0 0 1 0
0 1 0 1 0 0 1 0 1 1 0
0 0 1 0 1 1 0 1 0 1 0
1 1 0 0 1 0 0 1 1 0 1
0 0 0 1 0 1 1 0 0 1 0
Chcemy ustawić niektóre bity w tej macierzy w taki sposób, aby tworzyły ciągłą kroplę 1
s, w której każdy 1
jest bezpośrednio lub pośrednio połączony ze sobą 1
poprzez ruch ortogonalny:
0 1 1 1 1 1 1 0 0 1 0
0 1 0 1 0 0 1 0 1 1 0
0 1 1 0 1 1 1 1 0 1 0
1 1 0 0 1 0 0 1 1 1 1
0 0 0 1 1 1 1 0 0 1 0
(Możesz to lepiej zobaczyć, wyszukując za 1
pomocą funkcji „znajdź” w przeglądarce).
Jednak chcemy również zminimalizować liczbę bitów, które ustawiliśmy.
Zadanie
Biorąc pod uwagę macierz (lub tablicę tablic) bitów lub boolanów, zwróć minimalną liczbę bitów, które należy ustawić, aby utworzyć ciągły kontynent 1
s. Powinno być możliwe przechodzenie z jednego zestawu bitów w macierzy do drugiego poprzez przemieszczanie się tylko w kierunku ortogonalnym do innych ustawionych bitów.
To jest golf golfowy , więc wygrywa najkrótsze prawidłowe zgłoszenie (mierzone w bajtach).
Przypadki testowe
0 1 0 1 1 0 1 0 0 1 0
0 1 0 1 0 0 1 0 1 1 0
0 0 1 0 1 1 0 1 0 1 0
1 1 0 0 1 0 0 1 1 0 1
0 0 0 1 0 1 1 0 0 1 0
=> 6
1 0 0 0 0 0 1 0 0
1 1 0 0 1 1 1 0 0
1 1 1 0 1 1 1 1 1
0 1 0 0 0 0 0 0 0
0 0 0 0 0 1 1 1 1
0 1 0 0 0 0 1 1 0
1 0 0 0 0 0 1 0 0
=> 4
0 0 0 1 1 1 0 1 1
0 0 1 0 0 0 0 1 0
0 0 1 1 1 1 1 1 0
1 1 0 0 1 1 0 0 0
0 0 1 1 1 0 0 1 1
0 1 1 1 0 0 0 0 0
1 1 1 0 0 1 1 1 0
1 1 1 0 1 1 0 1 1
0 0 0 0 1 0 0 0 1
1 1 0 0 1 1 0 1 1
0 0 0 0 0 0 0 1 0
0 1 1 1 1 0 0 0 0
0 0 0 1 1 0 0 0 1
0 1 0 0 1 0 1 1 0
0 1 1 1 0 0 0 0 1
=> 8
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
=> 0
źródło
1
w matrycy?Odpowiedzi:
C (gcc),
308306 bajtówFunkcja
f
odbiera(height, width, flattened array, pointer to ans)
i zwraca odpowiedź wskaźnikiem.Jeśli nie ma
1
matrycy, zwróci0
.Wypróbuj online!
Nie golfowany:
źródło
Python 2 , 611 bajtów
Pełny program, który pobiera listę list na podstawie danych wprowadzonych przez użytkownika. Funkcje
I
id
policz liczbę wysp w tablicy. Pętla for na końcu wylicza wszystkie możliwości zmiany0
s na1
s, a jeśli pozostała jedna wyspa, zapisuje liczbę1
s dodanych do listyC
. Minimum tej listy to minimalna liczba bitów typu flip wymagana do połączenia dowolnych wysp. Jest to bardzo wolny algorytm, więc nie uruchamia przypadków testowych podanych poniżej 60 lat (nie próbowałem dłużej), ale wypróbowałem kilka mniejszych (~ 5x5) przypadków testowych i wydaje się, że działa poprawnie. Z tej strony mam algorytm zliczania wysp .Wypróbuj online!
Wersja wstępnie golfowana, zanim zoptymalizowałem kilka rzeczy:
źródło