Идеи реализации

Каждая из фигур n-полимино получается из некоторой фигуры n 1 -полимино следующим образом: на каждой стороне n 1 -полимино вырастает n-я клетка. Пронумеруем стороны так, как показано на рисунке:

Таблица иллюстрирует положения отростков (зелёный цвет), выросших на сторонах:

01234567

Среди построенных тетрамино нашлись равные: № 1=№ 2, № 5=№ 6.

Это соображение позволяет искать n-полимино рекурсивно:

для того, чтобы найти все n-полимино, нужно: если n=1, то: возвратить список, состоящий из единственной одноклеточной фигуры; конец если найти все n1-полимино; для каждой найденной фигуры n1-полимино: для каждой её стороны: добавить на этой стороне «отросток» в виде новой клетки; добавить построенную фигуру в список найденных n-полимино; конец цикла конец цикла сократить список найденных n-полимино, удалив оттуда «плохие», т. е. неодносвязные, а также в каждом классе равных друг другу фигур оставляя по одному представителю; возвратить переработанный список найденных фигур; конец процедуры

Поскольку приведённый алгоритм работает с фигурами в терминах сторон, а не клеток, удобно описывать фигуры в этих же самых терминах.

Предлагаем кодировать фигуры как замкнутые ломаные с единичными горизонтальными и вертикальными сторонами, направленными вправо, вверх, влево и вниз. Фигура — это последовательность сторон, но не каждая последовательность сторон есть фигура: ломаные могут быть незамкнутыми, могут иметь самопересечения.

Стороны фигур бывают четырёх типов, поэтому каждую можно было бы кодировать парой битов, упаковывая эти пары в байты (по 4 штуки), а байты — в строку. Однако манипуляции с битами — сложное занятие (см. «Манипуляции с отдельными битами в строке»). Лучше кодировать стороны символами R=right, U=up, L=left, D=down, а фигуру целиком — как строку, составленную из таких символов. Следует учесть, что одну и ту же замкнутую ломаную можно, стартуя из начальной вершины, обходить как против часовой стрелки, так и по часовой стрелке: