вот несколько идей.
Алгоритм грубой силы ванили попытался бы рекурсивно заполнить сетку, перечислив позиции сетки в фиксированном порядке (например, мажор строки) и всегда пытаясь уместить все возможные фигуры в текущей позиции, а затем рекурсивно. Это то, что вы упомянули, и это очень неэффективно.
Улучшение состоит в том, чтобы всегда считать для каждой свободной позиции количество фигур, которые там помещаются, а затем возвращаться к позиции, которая имеет наименьших посадок ; если у вас ноль штук, немедленно возвращайтесь; если есть один, где подходит только один кусок, заполните и продолжите (ветвь не создана); в противном случае выберите тот, который имеет наименее подходящие элементы (& ge; 2), и продолжайте оттуда.
Как только вы установите этот алгоритм, следующий вопрос заключается в том, как вы можете еще больше сократить пространство поиска. Если есть, скажем, кусочки A с «1» в верхнем положении и куски B с «1» в нижнем положении и A> B, то вы знаете, что по крайней мере A - B из кусочков «1 в верхнем положении» должен быть фактически размещен в верхнем ряду, чтобы вы могли исключить их из любой другой позиции. Это помогает уменьшить фактор ветвления и раньше находить тупики.
Вы также должны проверять на каждом шаге рекурсии, что у каждой фигуры есть хотя бы в одном месте, куда она подходит (выполните эту проверку после проверки того, что ни одна фигура не подходит только для одного места по скорости). Если есть кусок, который не подходит нигде, вы должны немедленно вернуться. Вы можете расширить это до проверки того, что каждая пара элементов соответствует для потенциально более ранней возможности проверки мертвой блокировки.
Существует также стратегия, называемая «не хронологическим отслеживанием» или «обратным переходом», которая исходит из исследований по решению SAT. Это поможет вам вернуться более чем на один уровень за раз, когда вы зашли в тупик; если вы хотите, вы можете найти эти термины в Google, чтобы найти больше, но вам нужно проделать определенную умственную работу, чтобы отобразить концепцию в проблемном пространстве.