Polystrips to podzbiór poliominoesów zgodny z następującymi zasadami:
- każdy kawałek składa się z 1 lub więcej komórek
- żadna komórka nie może mieć więcej niż dwóch sąsiadów
- komórki nie powinny otaczać dziury
Wolne poliomino są wyraźne, gdy żadna nie jest sztywną transformacją (translacja, obrót, odbicie lub odbicie poślizgowe) drugiej (części, które można podnieść i przewrócić). Tłumaczenie, obracanie, odbicie lub przesuwanie odzwierciedlające wolny poliomino nie zmienia jego kształtu ( Wikipedia )
Na przykład istnieje 30 darmowych pasków typu heptastrips (polystrips o długości 7). Oto wszystkie z nich, zapakowane w siatkę 14 x 15.
Źródło zdjęcia: Miroslav Vicher
Cel
Napisz program / funkcję, która przyjmuje na n
wejściu dodatnią liczbę całkowitą i wylicza różne wolne n
-polystripy.
n = 1 -> 1 (pojedynczy kwadrat)
n = 2 -> 1 (Istnieje tylko jedna możliwa 2-polistripowa złożona z 2 kwadratów)
n = 3 -> 2 (jeden składa się z 3 kwadratów połączonych w linię, a drugi ma kształt litery L)
n = 4 -> 3 (jeden prosty, jeden w kształcie litery L i jeden w kształcie litery Z)
. . .
Przypadki testowe:
n polystrips
1 1
2 1
3 2
4 3
5 7
6 13
7 30
8 64
9 150
10 338
11 794
12 1836
13 4313
14 10067
15 23621
Punktacja
To jest golf golfowy , więc krótszy kod jest lepszy. Byłbym bardzo wdzięczny za szczegółowe wyjaśnienia algorytmu i kodu.
Częściowe wdrożenie odniesienia w J.
Postanowiłem opisać każdy kawałek w formacie „wektorowym” i potrzebuję tylko n-2 bloków, aby opisać kawałek n-polystrip (jest tylko 1 2-polystrip i jest on zwracany jawnie). Bloki opisują kierunek względny: 0 - bez zmian; 1 - skręć w lewo; 2 - skręć w prawo. Nie ma znaczenia, w którym kierunku zaczniesz, ale tylko wskazanie, gdzie ma zostać umieszczona następna komórka. Może istnieć dowolna liczba kolejnych zer, ale cyfry 1 i 2 są zawsze pojedyncze. Ta implementacja jest częściowa, ponieważ nie uwzględnia otworów - rozwiązania dla n> 6 również liczą kawałki z dziurami.
101010
w przykładowej notacji)?