Найдите все комбинации дырокола 3x3

Я был на карнавале, где в каждом месте вашей программы помечают специальным дыроколом. Дырокол представляет собой сетку размером 3x3 ячейки. В каждом месте есть булавка, которая протыкает вашу бумагу, или нет. Это заставило меня задуматься, сколько разных узоров вы можете создать с помощью этого инструмента. Моей первой мыслью было: 2 ^ 9 = 512, но все 9 пробелов без вывода на самом деле не удар, так что на самом деле: 511.

Тогда сложность поразила меня. Тем более, что рабочие не так осторожны, когда пробивают вашу бумагу, все они будут выглядеть одинаково:

x..  .x.  ...  etc.
.x.  x..  .x.
...  ...  ..x

Вопрос: Как можно написать тест для учета вращения и смещения?


Усердие и мысли так far:

  • Двоичный код кажется очевидной частью этого уравнения
  • Когда уникальный образец найден, сохраните его в памяти, чтобы будущие образцы могли быть протестированы против него
  • Есть 4 возможности вращения.
    Редактировать: Под "поворотами" я подразумеваю то, что вы можете принять любую форму и повернуть ее на 90 градусов. Рассмотрим узор в виде точки в верхнем левом углу. Вы можете повернуть его на 90 градусов и получить точку в правом верхнем углу.Сделайте это еще раз, и он находится в правом нижнем углу. Опять же, это в нижнем левом углу. Используя чистое вычисление 2 ^ 9, это 4 разные комбинации. Однако для этой проблемы я пытаюсь отсеять именно такие дубликаты.
  • Для каждого поворота существует 25 способов наложения сеток 3x3:

Перекрытия:

/ = the spaces in the new one to test
\ = the spaces in a verified unique one

1               2               25
/ / / . . . .   . / / / . . .   . . . . . . .
/ / / . . . .   . / / / . . .   . . . . . . .
/ / X \ \ . .   . / X X \ . .   . . \ \ \ . .
. . \ \ \ . .   . . \ \ \ . .   . . \ \ \ . .
. . \ \ \ . .   . . \ \ \ . .   . . \ \ X / /
. . . . . . .   . . . . . . .   . . . . / / /
. . . . . . .   . . . . . . .   . . . . / / /
  • Перекрытие не нужно проверять, если какой-либо из шаблонов содержит штифт, которого нет в области перекрытия. Побитовое И здесь может помочь.
  • Если вы превратите каждую позицию для каждого из двух шаблонов в строки, вы можете просто проверить на равенство
  • Можно ли объединить эти две предыдущие идеи для повышения эффективности?
36
задан Lieven Keersmaekers 5 October 2011 в 08:12
поделиться