Мне приходит в голову мысль, что для любого набора, который имеет хотя бы один элемент, который появляется только один раз, вы можете поместить этот элемент в первую позицию списка для всех ответов, а затем сгенерировать все перестановки остальных число. Это довольно тривиальное решение, поскольку тот факт, что ваш первый элемент уникален, гарантирует отсутствие эквивалентов при циклическом сдвиге элементов. Очевидно, что все генерируемые вами решения должны быть уникальными.
Очевидная проблема заключается в том, что если у вас нет элементов, которые являются одиночными, то это полностью разрушается. Основная причина, по которой я это изложил, заключается в том, что есть несколько других решений, имеющих дело с no дубликатами, и я думаю, что это более эффективно, чем они (решает больше случаев), поэтому заслуживает упоминания. Это также довольно просто с точки зрения понимания того, как это работает, и его реализации. Я просто надеюсь, что мои рассуждения верны. ; -)
Изменить для дальнейших мыслей:
Мне приходит в голову, что этот принцип может быть распространен на ситуацию, когда у вас есть дубликаты в определенной степени.
Если вы берете один элемент (который, как мы предполагаем, теперь повторяется), вы можете посмотреть только на его перестановки, и какие из них позволили бы повторить сдвиг цикла, как и раньше, предполагая, что вы можете "заблокировать" один на месте без потери общности. Например, если у вас есть всего 6 элементов, и A дважды появляется в этом наборе, то вы можете иметь:
AAXXXX, AXAXXX, AXXAXX, AXXXAX, AXXXXA
Последнее из них такое же, как первое (в пределах циклического сдвига), поэтому может быть проигнорировано, то же самое, что второе и четвертое. Третий (AXXAXX) может быть циклически повторен тремя, чтобы вернуться к самому себе, поэтому имеет потенциал для циклов. Первые два никогда не могут приводить к циклам, независимо от того, сколько раз вы их циклируете, поэтому, если вы распределяете оставшиеся элементы, вам нужно только убедиться, что они являются уникальными, и вы гарантированно получите уникальные по результатам цикла.
Для третьего шаблона, который может циклически повторяться (AXXAXX), вам необходимо взглянуть на элемент B и повторить процесс для них. На этот раз, к сожалению, вы не сможете использовать хитрость блокировки первого значения для экономии времени.
Я не уверен на 100%, как бы вы превратили это в полностью работающую программу, но есть некоторые соображения о том, как избежать грубой силы.