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

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

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

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

Если такого значения нет, в ответ запишите 0.

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

Из предыдущего задания мы знаем, что 14  является позицией где Петя побеждает вторым ходом. Чтобы позиция считалась выигрышной для Вани вторым ходом, нужно, чтобы все ходы из нее вели в значения, где выигрыш Пети вторым ходом, но если учесть условие, то позиция победы Вани вторым ходом может вести также в позиции, где выигрыш Пети первым ходом. Так, позиция 13  является выигрышем Вани вторым ходом, так как ходы из нее ведут в 14  (выигрыш Пети вторым ходом) и в 26  (выигрыш Пети первым ходом).

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 31: # если камней в куче стало больше 30
        return 0 # прекращаем игру
    moves = [game(first_heap+1),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)

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

Решение АР

from functools import lru_cache


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


@lru_cache(None)
def game(heap):
    if heap >= 31:
        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, 31):
    if game(s) == ’V2’:
        print(s)
        break

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