Объединение некоторых идей из других ответов ...
Не отображать конфигурации в числа.Используйте числа для представления конфигураций.Напишите методы для работы с представлением, если вам действительно нужно получить / установить координаты x, y.
Затем выберите представление, с которым вы можете эффективно работать, чтобы ответить на вопрос.Вот одна идея.
У вас есть три операции, поэтому давайте дадим им названия:
- R = повернуть доску на 90 градусов против часовой стрелки
- M = зеркальная доскао оси y
- I = доска инвертирования (то, что вы называете «сопоставить», но я думаю, что «инвертировать» более наглядно)
Вы хотите посчитать количество классов эквивалентностидосок под орбитой этих операций.В каждом классе эквивалентности не более 16 элементов.Имея плату, вы можете сгенерировать другие 15 эквивалентных плат, применив операции в следующей последовательности:
R, R, R, I, R, R, R, M, R, R, R, I, R, R, R
(есть и другие последовательности, которые тоже работают ...)
Так что хорошей идеей было бы выбрать представление, которое делает R быстрым, я несколько быстрым,и не слишком беспокоиться о M.
Поскольку R не меняет центр, я бы держал его где-то еще и использовал бы последовательность 2-битных чисел для представления остальных 8 квадратов.Я хотел бы, чтобы первое 2-разрядное число представляло нижний левый, следующее 2-разрядное число представляло квадрат рядом с ним, и так далее, перемещаясь против часовой стрелки вокруг доски.Я хотел бы, чтобы 00 представлял "O", 11 представлял "X", и оба 01 и 10 представляли "пустое" (потому что тогда операция I становится простым переключением битов).
Тогдаесли вы запишите эти 8 2-битных чисел как одно 16-битное число, операция R будет просто операцией поворота 16-битного числа, которую ваш ЦП может, вероятно, выполнить в одной инструкции.Операция I - это просто XOR с -1 (но не забудьте также инвертировать центральный квадрат).Операция M - сложная куча манипуляций с битами, но так как вы делаете это только один раз из 15, кого это волнует?
Это должно позволить вам принять любое представление и быстро сгенерировать остальные 15, которые эквивалентны.Затем, как предлагает Диалектик, выберите наименьшее по численности представление в качестве своего канонического члена класса эквивалентности и сосчитайте их.