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

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

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

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

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

2S = 15 ⇒ S = 7.5  — такого не может быть, ведь мы работаем в целых числах.

S + 1 = 15 ⇒ S = 14  — ответ 14  .

Решение БУ

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) == ’P2’:
        print(s)
        break

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