Полистрипсы - это подмножество полиомино, соответствующих следующим правилам:
- каждая часть состоит из 1 или более клеток
- ни одна клетка не может иметь более двух соседей
- клетки не должны закрывать отверстие
Свободные полиомино отличаются, когда ни одно из них не является жестким преобразованием (перемещение, вращение, отражение или скользящее отражение) другого (фрагменты, которые можно подбирать и переворачивать). Перевод, вращение, отражение или скольжение, отражающее свободное полиомино, не меняет его форму ( Википедия )
Например, существует 30 свободных гептастрипов (полистрипов длиной 7). Вот все они, упакованные в сетку 14x15.
Изображение предоставлено Мирославом Вичером
Цель
Напишите программу / функцию, которая принимает положительное целое число в n
качестве входных данных и перечисляет различные свободные n
-полистрины.
n = 1 -> 1 (один квадрат)
n = 2 -> 1 (возможна только одна двухсторонняя полоса из 2 квадратов)
n = 3 -> 2 (один состоит из 3 квадратов, соединенных в линию, а другой - в форме буквы L)
n = 4 -> 3 (одна прямая, одна L-образная и одна Z-образная)
, , ,
Тестовые случаи:
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
счет
Это код-гольф , поэтому чем короче код, тем лучше. Я был бы очень признателен за подробные объяснения алгоритма и кода.
Частичная справочная реализация в J
Я решил описать каждую часть в «векторном» формате, и мне нужны только n-2 блока для описания части с n-полистрипами (есть только 1 2-полистрица, и она возвращается явно). Блоки описывают относительное направление: 0 - без изменений; 1 - повернуть налево; 2 - поверните направо. Неважно, в каком направлении вы начнете, нужно только указать, куда следует поместить следующую ячейку. Может быть любое количество последовательных нулей, но 1 и 2 всегда одинарные. Эта реализация является частичной, потому что она не учитывает дырки - решения для n> 6 также учитывают куски с дырками.
101010
в вашей выборочной записи)?