Polystrips são um subconjunto de poliominoes em conformidade com as seguintes regras:
- cada peça consiste em 1 ou mais células
- nenhuma célula pode ter mais de dois vizinhos
- as células não devem colocar um buraco
Os poliominos livres são distintos quando não há uma transformação rígida (translação, rotação, reflexão ou reflexão de deslizamento) de outra (peças que podem ser apanhadas e viradas). Traduzir, girar, refletir ou deslizar refletindo um poliomino livre não muda sua forma ( Wikipedia )
Por exemplo, existem 30 heptastrips livres (polystrips com comprimento 7). Aqui estão todos eles, agrupados em uma grade de 14x15.
Crédito da imagem: Miroslav Vicher
Objetivo
Escreva um programa / função que receba um número inteiro positivo n
como entrada e enumere as n
tiras livres-distintas .
n = 1 -> 1 (um único quadrado)
n = 2 -> 1 (Existe apenas uma 2 faixas possíveis de 2 quadrados)
n = 3 -> 2 (um é composto por 3 quadrados unidos em uma linha e o outro é em forma de L)
n = 4 -> 3 (um reto, um em L e um em Z)
. . .
Casos de teste:
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
Pontuação
Isso é código-golfe , então o código mais curto é melhor. Eu apreciaria muito as explicações detalhadas do algoritmo e do código.
Implementação de referência parcial em J
Decidi descrever cada peça no formato "vetor" e só preciso de n-2 blocos para descrever uma peça de n-poli-faixa (existe apenas 1 2-poli-faixa e é retornada explicitamente). Os blocos descrevem a direção relativa: 0 - sem alteração; 1 - vire à esquerda; 2 - vire à direita. Não importa em que direção uma começará, mas apenas para indicar onde a próxima célula será colocada. Pode haver qualquer número de 0s consecutivos, mas 1s e 2s são sempre únicos. Essa implementação é parcial, porque não leva em conta os furos - as soluções para n> 6 contam as peças com furos também.
101010
na notação de amostra)?