Wyobraź sobie następujący scenariusz: grasz pancernikami z przyjacielem, ale decydujesz się oszukiwać. Zamiast przesuwać statek po tym, jak strzela do miejsca, w którym był twój statek, decydujesz się nie umieszczać żadnych statków. Mówisz mu, że wszystkie jego strzały są chybione, dopóki nie da się tak ustawić statków.
Musisz napisać funkcję lub pełny program, który w jakiś sposób przyjmuje 3 argumenty: rozmiar pola, listę wielkości rozmiarów statków i listę zdjęć.
Pole walki
Jednym z podanych parametrów jest rozmiar płyty. Pole bitwy to kwadrat komórek, a podany parametr to po prostu jedna strona kwadratu.
Na przykład poniżej znajduje się tablica o rozmiarze 5.
Współrzędne w polu są określone jako ciąg 2-składnikowy: litera, po której następuje liczba. W niektórych przypadkach możesz polegać na literach.
Litera określa kolumnę, liczba określa wiersz komórki (indeksowany 1). Na przykład na powyższym zdjęciu podświetlona komórka jest oznaczona "D2"
.
Ponieważ jest tylko 26 liter, pole nie może być większe niż 26 x 26.
Statki
Statki są liniami prostymi złożonymi z 1 lub więcej bloków. Ilość statków jest określona na liście, gdzie pierwszy element to liczba statków 1-komórkowych, druga - statków 2-komórkowych i tak dalej.
Na przykład lista [4,1,2,0,1]
utworzyłaby następujący zestaw wysyłkowy:
Umieszczone na polu bitwy statki nie mogą się przecinać ani nawet dotykać. Nawet z zakrętami. Mogą jednak dotykać krawędzi pola.
Poniżej znajduje się przykład prawidłowego rozmieszczenia statków:
Możesz założyć, że dla danego zestawu zawsze istnieje miejsce na pustej planszy o danym rozmiarze.
Wydajność
Jeśli takie rozmieszczenie statków istnieje, musisz wyprowadzić dowolny z nich.
Program musi wypisać oddzieloną nową linią macierz znaków ascii dowolnego z 3 typów - jeden oznacza pustą komórkę, jeden - kawałek statku, a drugi - komórkę oznaczoną jako „brak”. Żadne inne znaki nie powinny być wyprowadzane.
Na przykład,
ZZ@Z
\@@Z
@\\Z
\Z\\
(W tym przykładzie zdefiniowałem @
pustą komórkę, komórkę \
„pominiętą” i Z
wysyłkę)
Jeśli takie miejsce nie istnieje, program / funkcja powinna powrócić bez wypisywania czegokolwiek.
Wejście
Jeśli zdecydujesz się stworzyć program w pełnej wersji, to zależy od ciebie, w jaki sposób wprowadzane są listy, niektóre mogą przechodzić przez argumenty, inne przez stdin.
To jest golf golfowy , wygrywa najmniejsza liczba znaków.
Przykład zoptymalizowanego rozwiązania bez gry w golfa można znaleźć tutaj.
Skompiluj -std=c99
, pierwszy argument to rozmiar planszy, pozostałe argumenty to wielkość statku. Oddzielona od linii nowa lista strzałów jest podana na standardowym ekranie. Przykład:
./a 4 1 1 1 <<< $'A2\nA4\nB3\nC3\nC4\D4'
10x10
dla 4,3,2,1
zestawu
26x26
? Naszkicowałem rozwiązanie oparte na wyrażeniach regularnych i rekurencji i staje się ono bardzo powolne = bezużyteczne dla pól więcej niż6x6
. Albo robię coś bardzo głupiego, albo brak odpowiedzi oznacza, że inni też nie odnoszą sukcesu.