Представьте себе сетку 3x3:
[A, B, %]
[C, %, D]
[E, F, G]
Проценты %
обозначают пустые места/позиции.
Ряды можно перемещать, как бусины на нитке, так что перестановки конфигураций для первого ряда могут быть любыми из:
[A, B, %] or [A, %, B] or [%, A, B]
Аналогично для второго ряда. Третья строка не содержит пустых слотов и поэтому не может быть изменена.
Я пытаюсь создать все возможные сетки с учетом возможных перестановок каждой строки.
На выходе должны получиться следующие сетки:
[A, B, %] [A, B, %] [A, B, %]
[C, D, %] [C, %, D] [%, C, D]
[E, F, G] [E, F, G] [E, F, G]
[A, %, B] [A, %, B] [A, %, B]
[C, D, %] [C, %, D] [%, C, D]
[E, F, G] [E, F, G] [E, F, G]
[%, A, B] [%, A, B] [%, A, B]
[C, D, %] [C, %, D] [%, C, D]
[E, F, G] [E, F, G] [E, F, G]
Я попробовал метод просмотра каждой строки и смещения пространства влево и вправо, затем создания новых сеток и рекурсии. Я держу все сетки в наборе и гарантирую, что создаю только те позиции, которые еще не были проверены, чтобы предотвратить бесконечную рекурсию.
Однако мой алгоритм кажется ужасно неэффективным (~ 1 с на перестановку!!) и выглядит не очень красиво. Мне было интересно, есть ли красноречивый способ сделать это? В питоне в частности.
У меня есть некоторые смутные идеи, но я уверен, что есть короткий и простой способ сделать это, который я упускаю из виду.
EDIT: 3x3 — это просто пример. Сетка может быть любого размера, и на самом деле важны комбинации строк. Например:
[A, %, C]
[D, E, %, G]
[H, I]
также является допустимой сеткой.
EDIT 2: Буквы должны сохранять свой порядок. Например, [A, %, B] != [B, %, A]
и [B, A, %]
недействительны.