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

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

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

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

Мы знаем, что позиция (9,9)  – это позиция LOSE1  . Значит все позиции, которые ведут в эту, являются WIN2 . Нам подойдут значения S = 18  и S = 19  (18∕2 = 9 и 19∕2 = 9  ). Значит нам подойдёт значение 19  .

 

Решение Excel

PIC

Для решения используем табличку, которую сделали для решения 19 задачи.

Добавляем новый столбик — Петя (второй ход Пети).

Вырезаем имеющиеся числовые значения из таблички и вставляем их в ячейку E4  , в неё же записываем =B4-1, а в F4 — =С4

Теперь добавим условное форматирование. Все ячейки, относящиеся к первому столбику Петя, мы окрасим зелёным (в разделе Главная выберем условное форматирование ⇒ Правила выделения ячеек ⇒ Меньше…, в открывшемся окошке записываем 13  и выбираем зелёный цвет).

Копируем полученную таблицу в вставляем её три раза. Меняем первые ходы Пети, чтобы не было повторов.

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

 

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

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры
    if first_heap + second_heap <= 12:  # Если камней в кучах стало меньше 12
        return 0  # Прекращаем игру
    # Генерация всех возможных ходов
    moves = []
    if second_heap > 1:
        moves.append(game(first_heap, second_heap // 2))
    if first_heap > 1:
        moves.append(game(first_heap // 2, second_heap))
    if first_heap > 0:
        moves.append(game(first_heap - 1, second_heap))
    if second_heap > 0:
        moves.append(game(first_heap, second_heap - 1))
    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(4, 26):
    # если в данной позиции возможен выигрыш Вани первым ходом
    if game(9,i) == 2:
        print(i)

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