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

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

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

В данной задаче требуется найти позицию, где выигрыш Пети вторым ходом. Чтобы это сделать, найдём позиции, где выигрыш Пети первым ходом и позиции, где выигрыш Вани первым ходом. Все позиции при S ≥ 24  — это позиции выигрыша Пети первым ходом. Тогда позиция 23  считается выигрышем Вани первым ходом, так как все ходы ведут в значения выигрыша Пети первым ходом. Тогда 22  является позицией выигрыша Пети вторым ходом, так как из неё мы можем попасть в значение, которое является выигрышем Вани первым ходом. Больше позиций типа выигрыша Пети вторым ходом не существует, так как 23  не делится на 3  нацело.

Ответ: 22

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 71: # если камней в куче стало больше 70
        return 0 # прекращаем игру
    moves = [game(first_heap+1),game(first_heap*3)] # прописываем ходы возможные в партии
    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,71):
    if game(i) == 2: # если в данной позиции возможен выигрыш Пети вторым ходом
        print(i)

Решение АР

from functools import lru_cache


def moves(heap):
    return heap + 1, heap * 3


@lru_cache(None)
def game(heap):
    if heap >= 71:
        return ’END’
    elif any(game(x) == ’END’ for x in moves(heap)):
        return ’P1’
    elif all(game(x) == ’P1’ for x in moves(heap)):
        return ’V1’
    elif any(game(x) == ’V1’ for x in moves(heap)):
        return ’P2’
    elif all(game(x) == ’P1’ or game(x) == ’P2’ for x in moves(heap)):
        return ’V2’


for s in range(1, 71):
    if game(s) == ’P2’:
        print(s)

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