Если ввод поступает по порядку и при условии, что количество мест всегда до 12
, есть только 2^12
способов, которыми места можно занять в каждом штате (группа пассажиров). Вы можете использовать это, чтобы сократить количество состояний для решения перебора / напоминания.
Псевдокод:
IsSeatingPossible( mask, passengers ) =
if ( no more passengers ) return true
return IsSeatingPossible =
new_mask = mask + brute force on passenger constraints
if any IsSeatingPossible( new_mask,
passengers - just processed passengers )
Больше объяснений:
Маска в основном представляет собой массив из 12 логических значений, в котором указывается, берется ли seat_i для каждого i (вы можете легко преобразовать 2D (x,y)
-> 1D (x)
). Затем вы перебираете возможности. Полное размещение возможно, если для этого пассажирского набора (A_1, A_2, .., A_k)
у каждого есть место, и у остальных пассажиров есть места.
Таким образом, маска, которая передается на английском языке, это места, которые заняты. Допустим, вы сидите (A_1, A_2, .., A_k)
на сидениях (x_1, x_2, .., x_k)
. Есть несколько подмножеств, в которых могут сидеть пассажиры, ограниченные N choose k
, что в данном случае мало. Это та часть, на которой ты грубой силой. Учитывая конкретный (x_1, x_2, .., x_k)
, это размещение возможно, если (x_1, x_2, .., x_k)
не перекрывается с текущей маской (по существу, нет конфликтующих мест) и что возможно обрабатывать остальные запросы пассажиров, учитывая, что новая маска, который является просто установленным дополнением текущей маски и (x_1, x_2, .., x_k)
. (Новые наборы сидений, которые заняты.)
Это может быть или не быть достаточно быстрым. Замечательно отметить, что кроме того, какие места заняты и какие пассажиры были обработаны, решение для определенной подзадачи одинаково. Поэтому вы можете ускорить это тривиально, используя memoization . Это дает O(N 2^N)
космическое решение.
Маска лучше всего реализована с использованием битовой маски, особенно для N = 12
, отсюда и название. Для списка запросов пассажиров вам, вероятно, нужно просто отслеживать, какой индекс.