Задание №19 — Теория игр
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу одии камень или увеличить количество камней в куче в два раза.
Например, имея кучу из 15 камней, за один ход можно получить кучу из 16 или 30 камней. Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней. Игра завершается в тот момент, когда количество камней в куче становится не менее 201. Победителем считается игрок, сделавший последний ход, т. е. первым получивший кучу, в которой будет 201 или больше камней. В начальный момент в куче было 5 камней, 1 ≤ S ≤ 200. Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т. е. не являющиеся выигрышными независимо от игры противника.
Укажите такое значение S, при котором Петя не может выиграть за один ход, но при любом ходе Пети Ваня может выиграть своим первым ходом.
Правильный ответ
100
Пояснение
Решение:
Из кучи в камней ход «добавить камень» даёт , ход «удвоить» даёт . Так как при любом , выиграть одним ходом можно тогда и только тогда, когда , то есть при .
Поэтому условие «Петя не может выиграть за один ход» означает .
Дальше нужно, чтобы любой ход Пети приводил к куче, из которой Ваня выигрывает одним ходом, то есть к куче не менее чем в 101 камней:
- после хода «+1» получается , нужно , то есть ;
- после хода «×2» получается , нужно , то есть .
Вместе с остаётся единственное значение .
Проверка: из кучи в 100 камней Петя получает 101 или 200 камней — до 201 не хватает ни в одном случае. Из 101 камней Ваня удваивает и получает 202 камней, из 200 камней Ваня добавляет один камень и получает 201 камней. И то и другое не меньше 201, значит Ваня выигрывает своим первым ходом при любом ходе Пети.
Тот же ответ даёт перебор:
N = 201
def moves(s):
return [s + 1, 2 * s]
def win1(s): # ходящий выигрывает первым же ходом
return any(t >= N for t in moves(s))
for s in range(1, N):
# сам выиграть не может, но любой его ход отдаёт победу сопернику
if not win1(s) and all(win1(t) for t in moves(s)):
print(s) # 100
Ответ: 100