A while back Я написал простую программу python для перебора единственного решения для головоломки с ядром гайки.Создание всех уникальных комбинаций для головоломки «drive ya nuts»
alt text http://www.tabbykat.com/Drive%20ya%20Nuts%20Travel%20Sol%20c.jpg
Головоломка состоит из 7 шестиугольников с номерами 1-6 на них, и все части должны быть расположены так, чтобы каждое число находится рядом с тем же номером на следующей части.
головоломка ~1.4G
неуникальных возможностей: у вас есть 7!
варианты сортировки частей по порядку (например, center=0
, top=1
, продолжая по часовой стрелке ...). После того, как вы отсортировали фигуры, вы можете вращать каждую часть по 6 способами (каждая часть представляет собой шестиугольник), поэтому вы получаете 6**7
возможных поворотов для заданной перестановки 7 штук. Всего: 7!*(6**7)=~1.4G
возможностей. Следующий код Python генерирует следующие возможные решения:
def rotations(p):
for i in range(len(p)):
yield p[i:] + p[:i]
def permutations(l):
if len(l)<=1:
yield l
else:
for perm in permutations(l[1:]):
for i in range(len(perm)+1):
yield perm[:i] + l[0:1] + perm[i:]
def constructs(l):
for p in permutations(l):
for c in product(*(rotations(x) for x in p)):
yield c
Однако, обратите внимание, что головоломка имеет только ~0.2G
уникальных возможных решений, так как вы должны разделить общее количество возможностей по 6, так как каждому возможному решению эквивалентно- другие решения (просто поверните всю головоломку на 1/6 оборота).
Есть ли лучший способ генерировать только уникальные возможности для этой головоломки?
Я не вижу, как ~ 1.4G/6 = ~ 2M. Возможно, вы имели в виду ~ 200M? – Thomas
@Thomas Есть 1.4G способы упорядочить фигуры, но не все они являются решениями. –