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

Для игры, описанной в предыдущем задании, найдите количество таких значений S,  при которых у Пети есть выигрышная стратегия, причём Петя не может выиграть за один ход и Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.

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

Из предыдущего задания мы знаем, что в отрезке значений [11;30] Петя побеждает своим первым ходом. Для начала нужно определить значения, в которых Ваня побеждает своим первым ходом. Значения, из которых ВСЕ первые ходы ведут в вышеописанный отрезок – это значения, в которых Ваня побеждает своим первым ходом. Распишем значения и стратегии, при которых Ваня побеждает своим первым ходом:

S = 9  . Петя может увеличить количество камней до 11  , 18  или 27  камней. Во всех случаях Ване не составит труда следующим ходом завершить партию.

S = 10  . Петя может увеличить количество камней до 12  , 20  или 30  камней. Во всех случаях Ване не составит труда следующим ходом завершить партию.

После того как мы определили значения, в которых Ваня побеждает своим первым ходом мы можем определить значения, в которых Петя побеждает своим вторым ходом. Значение, из которого ХОТЯ БЫ ОДИН ход ведёт в 9  или       10  – это значение, в котором Петя побеждает своим вторым ходом. Распишем значения и стратегии, при которых Петя победит вторым ходом:

S = 3  . Петя может увеличить количество камней до 9  ходом ∗3

S = 5  . Петя может увеличить количество камней до 10  ходом ∗2

S = 7  . Петя может увеличить количество камней до 9  ходом + 2

S = 8  . Петя может увеличить количество камней до 10  ходом + 2

В ответ нужно указать количество значений S. Ответ: 4

Решение программой

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

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