Сергей-4030> Вроде бы, нет. Я на это обращал внимание, все вроде как покрывается. Собственно, два поворота есть центральная симметрия, правильно?
Да, поэтому я её и не упомянул.
Сергей-4030> Все преобразования циклические, поэтому можно особо не париться. Вернее, конечно, у меня проверяется суперпозиция, но собственно разных преобразований (и "простых" и суперпозиций) не очень много.
Простых 5 — 4 осевые и 1 поворотная. Надо будет посчитать варианты выражения через другие. Как с центральной. Приду домой — займусь.
Пока вышло так
H - Horizontal flip
V — Vertical flip
Dl — Diagonal — top left upper bottom right
Dr — Diagonal — top right bottom left
R — Rotation from X to Y 90
0
HV=RR
VH=RR
DlDr=RR
DrDl=RR
VDr=RRR=R
-1
VDl=R
HDr=R
HDl=RRR=R
-1
VR=Dl
RV=Dl
HR=Dr
RH=Dr
DlR=H
RDl=V
DrR=V
RDr=H
Всякие RRRH рассматривать неинтересно — сокращается легко RRRH=RRDr=RH=Dr. Да, ты прав, никаких других суперпозиций не надо. Итого, H, V, Dl, Dr, R, RR, RRR. Для проверок R, RR, RRR даже не надо копии массива каждый раз. С ростом размера может оказаться. что сделать H, проверить, HV проверить будет быстрее, чем сделать копию H, проверить, на копии проверить V.
Похоже, что это будет просто быстрее в любом случае, т.к. при создании нового объекта приходится в него копировать циклом в любом случае. Оставим копирование только для запоминания результата.
Т.е., что-то вроде (HFlip, VFlip, DlFlip, DrFlip, Rotate выдают reference на себя, CheckSolution выдает true, если решение надо добавить; в принципе, оно может сразу и добавлять):
code text
if ( CheckSolution( solution ) ) solutions.AddSolution( solution );
if ( Checsolution( solution.HFlip( ) ) solutions.AddSolution( solution );
if ( Checsolution( solution.HFlip( ).VFlip( ) ) solutions.AddSolution( solution );
if ( Checsolution( solution.VFlip( ).DlFlip( ) ) solutions.AddSolution( solution );
if ( Checsolution( solution.DlFlip( ).DrFlip( ) ) solutions.AddSolution( solution );
if ( Checsolution( solution.DrFlip( ).Rotate( ) ) solutions.AddSolution( solution );
if ( Checsolution( solution.Rotate( ) ) solutions.AddSolution( solution );
if ( Checsolution( solution.Rotate( ) ) solutions.AddSolution( solution );