Задание №21 — Теория игр
Условие игры
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень или увеличить количество камней в куче в два раза. Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней. Игра завершается в тот момент, когда количество камней в куче становится не менее 153. Победителем считается игрок, сделавший последний ход, т. е. первым получивший кучу из 153 или больше камней. В начальный момент в куче было S камней, 1S152. Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Укажите такое значение S, при котором Петя не может выиграть за один ход, но при любом ходе Пети Ваня может выиграть своим первым ходом.
Для игры, описанной выше, найдите минимальное значение S, при котором одновременно выполняются два условия:
— у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
— у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Правильный ответ
74
Пояснение
Решение:
Напомним условие игры из задания 19. Перед игроками одна куча камней, игроки ходят по очереди, первым ходит Петя. За один ход игрок может добавить в кучу один камень или увеличить количество камней в куче в два раза. Игра заканчивается в тот момент, когда количество камней в куче становится не менее 153; побеждает тот, кто сделал последний ход. В начальный момент в куче камней, .
Классифицируем позиции (ходит тот, чья очередь):
- — ходящий выигрывает своим первым ходом, то есть одним ходом заканчивает игру;
- — ходящий сразу выиграть не может, а любой его ход отдаёт сопернику позицию из ; значит, соперник выигрывает своим первым ходом;
- — ходящий сразу выиграть не может, но у него есть ход в , поэтому он выигрывает своим вторым ходом;
- — ходящий сразу выиграть не может, и каждый его ход ведёт в или в ; значит, соперник выигрывает первым или вторым своим ходом.
Первым ходит Петя, поэтому два условия задачи вместе означают: стартовая позиция принадлежит , но не принадлежит — иначе Ваня гарантированно выигрывал бы первым ходом. Нужно наименьшее такое . Проще всего перебрать все программой, вычисляя , , , прямо по этим определениям:
N = 153
def moves(s):
return [s + 1, 2 * s]
def over(s):
return s >= N
def win1(p): # ходящий выигрывает своим первым ходом
return any(over(q) for q in moves(p))
def lose1(p): # соперник выигрывает своим первым ходом
return not win1(p) and all(win1(q) for q in moves(p))
def win2(p): # ходящий выигрывает своим вторым ходом
return not win1(p) and any(lose1(q) for q in moves(p))
def lose2(p): # соперник выигрывает первым или вторым ходом
return not win1(p) and all(win1(q) or win2(q) for q in moves(p))
for s in range(1, 153):
if lose2(s) and not lose1(s):
print(s)
break
Перебор идёт по возрастанию , поэтому первое напечатанное значение и есть минимальное: . Проверим его вручную. Из стартовой позиции Петя может получить:
- — здесь Ваня сразу выиграть не может, поэтому он отвечает ходом в . Эта позиция проигрышная для Пети: куда бы он ни пошёл, Ваня своим вторым ходом доводит игру до конца (из — в ; из — в );
- — Ваня выигрывает сразу: одним ходом он получает , а это уже не меньше 153.
Значит, при любой игре Пети Ваня выигрывает первым или вторым ходом. Гарантировать выигрыш именно первым ходом он не может: Пете достаточно сделать тот ход, после которого Ване приходится тратить второй ход. Оба условия выполнены.
Ответ: 74