Чтобы сделать вещи более эффективными (и предположим, что решений гораздо меньше, чем перестановок), идея такова:
- Генерация всех перестановок одна за другой.
- Не интерпретировать перестановка в обычном порядке, но интерпретировать его как указание для каждого ди git, в какую позицию он будет go. Таким образом, с учетом перестановки
(3, 2, 0, 1)
интерпретируйте ее как 0, перейдите к положению 3, 1 перейдите к положению 2, 2 к положению 0, 3 к положению 1 (таким образом, обратная перестановка : (2, 3, 1, 0)
). Тогда тест для принятия перестановки или нет, является гораздо более простым.
Вот реализация в Python, но ту же идею можно применить на любом языке программирования:
from itertools import permutations
num = 0
q = [0 for _ in range(8)] # create a list to fit 8 values
for p in permutations(range(8)):
if p[0] < p[1] < p[3] and p[2] < p[3] and p[4] < p[5] and p[6] < p[7]:
for i, pi in enumerate(p):
q[pi] = i
num += 1
print(num, q)
Выход:
1 [0, 1, 2, 3, 4, 5, 6, 7]
2 [0, 1, 2, 3, 4, 6, 5, 7]
3 [0, 1, 2, 3, 4, 6, 7, 5]
4 [0, 1, 2, 3, 6, 4, 5, 7]
5 [0, 1, 2, 3, 6, 4, 7, 5]
6 [0, 1, 2, 3, 6, 7, 4, 5]
...
1257 [4, 6, 7, 5, 2, 0, 1, 3]
1258 [6, 4, 5, 7, 2, 0, 1, 3]
1259 [6, 4, 7, 5, 2, 0, 1, 3]
1260 [6, 7, 4, 5, 2, 0, 1, 3]