Задание №21 — Теория игр
Условие игры
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один или четыре камня либо увеличить количество камней в куче в три раза. Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней. Игра завершается в тот момент, когда количество камней в куче становится не менее 223. Победителем считается игрок, сделавший последний ход, т. е. первым получивший кучу, состоящую из 223 или более камней. В начальный момент в куче было S камней;
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Укажите такое значение S, при котором Петя не может выиграть за один ход, но при любом ходе Пети Ваня может выиграть своим первым ходом.
Для игры, описанной выше, найдите минимальное значение S, при котором одновременно выполняются два условия:
– У Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
– У Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Если найдено несколько значений S, в ответе запишите наименьшее из них.
Правильный ответ
69
Пояснение
Решение:
Напомним условия игры: перед игроками одна куча камней, за ход можно добавить в кучу один или четыре камня либо увеличить количество камней втрое; выигрывает тот, кто первым получит кучу из камней или больше. Первым ходит Петя, в начале в куче камней.
Позицию будем оценивать с точки зрения игрока, который ходит из неё. Обозначим: В1 — из позиции можно выиграть первым же ходом; П1 — любой ход не заканчивает игру и переводит соперника в В1 (то есть ходящий проигрывает следующим ходом соперника); В2 — позиция не В1, но есть ход, переводящий соперника в П1, то есть ходящий выигрывает ровно вторым своим ходом при любой игре соперника.
В1. Игру заканчивает ход , или ; самое слабое условие — , поэтому В1 — это все .
П1. Нужно , но чтобы каждый ход попадал в В1. Самое сильное требование даёт ход «добавить один камень»: , то есть . Значит, единственная позиция П1 — это .
В2. Это позиции, из которых есть ход ровно в : , .
Теперь про Ваню. Ваня выигрывает первым или вторым своим ходом при любой игре Пети, если каждый ход Пети приводит в позицию из В1 или В2 (и не заканчивает игру). Гарантированной победы первым ходом у Вани нет, если хотя бы один ход Пети ведёт не в В1, а в В2. Значит, нужно минимальное , у которого все ходы попадают в , но не все — в В1.
При ходы Пети дают (В2), (В2), (В1) — условие выполнено. Меньших значений нет: наименьшая позиция из — это , а ход «добавить один камень» переводит в , поэтому обязательно .
Проверка программой:
N = 223
def moves(s):
return [s + 1, s + 4, 3 * s]
def win1(s): # В1: выигрыш своим первым ходом
return any(t >= N for t in moves(s))
def lose1(s): # П1: любой ход отдаёт победу сопернику
return all(t < N and win1(t) for t in moves(s))
def win2(s): # В2: выигрыш вторым ходом, но не первым
return not win1(s) and any(t < N and lose1(t) for t in moves(s))
def lose2(s): # Ваня выигрывает первым или вторым ходом,
return (all(t < N and (win1(t) or win2(t)) for t in moves(s))
and not lose1(s)) # но не гарантированно первым
print(min(s for s in range(1, N) if lose2(s)))Ответ: 69