Задание №19 — Теория игр
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может:
– добавить в одну из куч (по своему выбору) два камня
– увеличить количество камней в куче в три раза.
Например, пусть в одной куче 10 камней, а в другой 7 камней; такую позицию в игре будем обозначать (10, 7). Тогда за один ход можно получить любую из четырёх позиций: (12, 7), (30, 7), (10, 9), (10, 21). Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.
Игра завершается в тот момент, когда количество камней в куче становится не менее 136. Победителем считается игрок, сделавший последний ход, т. е. первым получивший такую позицию, что в кучах всего будет 136 или больше камней.
В начальный момент в первой куче было два камня, во второй куче — S камней;
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т. е. не являющиеся выигрышными независимо от дальнейшей игры противника.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение S, когда такая ситуация возможна.
Правильный ответ
15
Пояснение
Решение:
Позиция игры — пара чисел . За один ход можно прибавить 2 камня к одной из куч или увеличить одну из куч в три раза. Игра заканчивается, когда суммарное количество камней достигает 136.
Из позиции ходящий заканчивает игру, если , или , или . Так как и , условие равносильно : выгоднее всего утроить бо́льшую кучу. Нужно наименьшее , при котором у Пети есть ход, не заканчивающий игру, после которого Ваня выигрывает сразу.
Из начальной позиции Петя может получить позиции , , и . Самая опасная — : Ваня утраивает вторую кучу ещё раз и получает сумму . Условие даёт , , то есть .
Другие ходы требуют большего : из Ваня получает сумму , откуда ; из — , ; из — , .
Проверим . Петя ходит : сумма 47, игра продолжается. Ваня утраивает вторую кучу: , сумма — победа первым ходом. Сам Петя закончить игру не мог: . При такая ситуация невозможна.
def moves(p):
a, b = p
return [(a + 2, b), (a, b + 2), (3 * a, b), (a, 3 * b)]
def win1(p):
return any(x + y >= 136 for x, y in moves(p))
for S in range(1, 133):
if any(x + y < 136 and win1((x, y)) for x, y in moves((2, S))):
print(S)
break
Ответ: 15