Я подошел к проблеме под другим углом для другой (незавершенной) игры слов. В моем дизайне платы были выбраны, если их можно было отразить по оси X или Y (или и тем и другим).
Принимая квадрат размера N, я создал все возможные решетки, используя битную маску, принимающую 2^количество клеток -1 как максимальное значение. Итак, для сетки 2x2 (4 ячейки), перейдите от 0 ... 15.
0 - пустой сетки
1 - черный блок в левом верхнем углу
2 - черный блок в правом верхнем углу
3 - черные блоки в верхней строке
.
.
.
15 - сетка полна черных блоков
Очевидно, что это дает много, не подходящих кандидатов. Мы можем упасть:
- Patterns где строки не совпадают по обе стороны от полпути точки (и так далее наружу) для Y-оси зеркального отображения
- Patterns где столбцы не совпадают либо сторона полупути точки (и так далее наружу) для X-осей зеркальных отображения
- сетки полной черных блоков
- Шаблонов, где экстенты сетки (в первом ряду, последняя строка, первый колонка, последний колонка) не имеют белых блоков
- P (*)
Я думаю, что я провел это примерно до 7x7, и это закончилось за разумный отрезок времени. Я не выбрал слова. Однако, как только вы свернули числа, вы можете просто сохранить все значения кандидата для каждого размера сетки, а затем просто создавать новые кроссворды каждый раз.
(*) - для игры я писал, это было важно, но я не уверен на 100%, что это требование для кроссворда. Имея 2 или более отдельных рисунка белых квадратов на разных участках доски (как бы это ни было настроено), я мог бы считать, что это абсолютно верно.