Задача к ЕГЭ по информатике на тему «Теория игр» №2

Для игры, описанной в задании #58099, найдите минимальное значение S, при котором одновременно выполняются два условия:

— у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;

— у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

Решение руками

Исходя из прошлого задания, мы знаем, что при изначальной позиции (12,30)  камней в кучах побеждает Петя вторым ходом. Минимальный ход, который доступен нам в партии это + 1  .

Разберём позицию, где изначальное количество камней в кучах равно (12,29)  . Пете не стоит делать ход + 1  для второй кучи, поскольку тогда мы получим позицию (12,30)  , в ней выигрывал Петя вторым ходом, но поскольку первый ход из этой позиции будет делать Ваня, то уже он выиграет вторым ходом.

Получается Петя сделает своим ходом позицию (13,29)  камней в кучах.

Исходя из прошлой задачи, мы знаем, что позиция (13,30)  камней в кучах является выигрышной для игрока, который попал в данную позицию своим ходом.

Получается, Ваня своим первым ходом в позиции (13,29)  увеличит на 1  именно вторую кучу и гарантированно выиграет в данной партии своим вторым ходом. Ответ:29

Программное решение

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры.
    if first_heap + second_heap >= 74:  # Если сумма камней в кучах стала больше 73
        return 0  # Прекращаем игру
    moves = [game(first_heap, second_heap+1), game(first_heap+1, second_heap),
             game(first_heap * 2, second_heap),game(first_heap, second_heap * 2)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,62):
    # если в данной позиции возможен выигрыш Вани вторым ходом
    if game(12,i) == -2:
        print(i)

Ответ: 29
Оцените статью
Я решу все!