Построение пати из 6 героев по правилам

тема: Перебор с возвратом · уровень: средний

Условие

В игре у вас есть ровно 6 разных героев с номерами 1..6. Перед рейдом нужно поставить их в линию слева направо (6 позиций).

Гильдия выдала список правил, и нужно узнать, сколько разных расстановок им удовлетворяют.

Есть 3 вида правил:

Найдите количество расстановок (перестановок героев 1..6), которые удовлетворяют всем правилам.

Формат ввода

Первая строка: целое число r — количество правил. Далее r строк, в каждой правило одного из трёх видов: B x y, N x y или P x k.

Формат вывода

Выведите одно целое число — количество подходящих расстановок.

Ограничения

Пример

Ввод:

3
P 1 1
B 2 3
N 4 5

Вывод:

36

В этом примере герой 1 обязан быть первым, герой 2 должен стоять левее героя 3, а герои 4 и 5 не могут быть соседями.

Разберись руками

Есть 6 героев 1..6 и 6 позиций в линии. В примере: герой 1 обязан быть на позиции 1, герой 2 должен стоять левее героя 3, а герои 4 и 5 не могут быть соседями. Нужно руками посчитать, сколько расстановок подходит.

Идея: Сначала считаем варианты без части правил (например, когда один герой уже зафиксирован). Потом аккуратно отсекаем: правило “левее” обычно делит варианты пополам из-за симметрии перестановок, а правило “не рядом” удобно проверять через подсчёт плохих случаев, где пара стоит рядом (склеиваем их в блок), и вычитаем плохие из всех.

Решить задачу с автопроверкой на Python →

Куда дальше