Polystripler, aşağıdaki kurallara uyan bir polimino alt kümesidir:
- her parça 1 veya daha fazla hücreden oluşur
- hiçbir hücrede ikiden fazla komşu olamaz
- hücreler bir deliği kapatmamalıdır
Serbest polimomlar, hiçbiri bir başkasının (toplanıp çevrilebilen parçalar) katı bir dönüşümü (çeviri, döndürme, yansıma veya kayma yansıması) olmadığında farklıdır. Serbest bir poliominoyu yansıtan çeviri, döndürme, yansıtma veya kayma şeklini değiştirmez ( Wikipedia )
Örneğin, 30 serbest heptastrip (uzunluğu 7 olan polystripler) vardır. Hepsi 14x15 ızgaraya yerleştirilmiş.
Fotoğraf kredisi: Miroslav Vicher
Hedef
n
Girdi olarak pozitif bir tamsayı alan ve farklı serbest n
-polystripleri numaralandıran bir program / fonksiyon yazın .
n = 1 -> 1 (Tek kare)
n = 2 -> 1 (2 kareden oluşan sadece bir olası 2-polystrip vardır)
n = 3 -> 2 (Biri bir hatta birleştirilen 3 kareden oluşur ve diğeri L şeklindedir)
n = 4 -> 3 (Bir düz, bir L şeklinde ve bir Z şeklinde)
. . .
Test senaryoları:
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
puanlama
Bu kod golf , bu yüzden daha kısa kod daha iyidir. Algoritmanın ve kodun ayrıntılı açıklamalarını çok takdir ediyorum.
J'de kısmi referans uygulaması
Her parçayı "vektör" formatında tanımlamaya karar verdim ve n-polystrip parçasını tanımlamak için sadece n-2 bloğuna ihtiyacım var (sadece 1 2-polystrip var ve açıkça iade ediliyor). Bloklar göreceli yönü tanımlar: 0 - değişiklik yok; 1 - sola dönün; 2 - sağa dönün. Hangi yönün başlayacağı önemli değil, sadece bir sonraki hücrenin nereye konulacağını belirtmek. Herhangi bir sayıda ardışık 0 olabilir, ancak 1'ler ve 2'ler her zaman bekar. Bu uygulama kısadır, çünkü delikleri hesaba katmaz - n> 6 için çözümler delikli parçaları da sayar.
101010
örnek gösteriminizde) olduğunu varsayalım ?