← К задачам
Тяжело · +5Динамическое программированиеЕГЭ задание 21Теория игр

Задание 21: все выигрышные начальные позиции

Игра «Куча камней»: в куче лежит некоторое количество камней. Игроки ходят по очереди, первым ходит Петя. За один ход игрок добавляет в кучу одно из чисел камней, разрешённых списком moves (например [1, 2] — добавить 1 или 2 камня). Выигрывает игрок, после чьего хода в куче становится S или больше камней (S — заданный порог).

На этот раз нужен ПОЛНЫЙ анализ игры (дерево всех партий), без ограничения на число ходов. Напишите функцию winning_positions(S, moves), возвращающую отсортированный список ВСЕХ значений s0 из отрезка [0, S-1], при которых игрок, делающий ход, выигрывает при оптимальной игре обеих сторон (неважно, за сколько ходов).

Подсказка: считайте от больших s к меньшим (обратная индукция) — позиция выигрышная, если из неё есть ход в позицию, проигрышную для соперника (или сразу завершающую игру).

Пример: winning_positions(7, [1, 2])[0, 2, 3, 5, 6] (позиции 1 и 4 — проигрышные).

def winning_positions(S, moves):
    # ваш код
    pass
Для запуска тестов необходима авторизация.