Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень, добавить два камня или увеличить количество камней в куче в два раза. При этом не разрешается делать ход, после которого количество камней в куче будет делиться
Например, если в начале игры в куче
Игра завершается, когда количество камней в куче становится
Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет 103 или больше камней.
В начальный момент в куче было
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.
Укажите такое
Такое значение S — 50. Своим первым ходом Петя может получить
Ответ: 50.
Приведём решение Юрия Красильникова на языке Python.
def игра(ход,лимит,куча):
# (Номер хода, ограничение на число ходов, количество камней)
# результаты: 1 - выигрыш 1-го игрока, 2 - второго, 0 - победителя нет
игрок = 2-ход%2 # нечетные ходы - игрок 1, четные - игрок 2
враг = 3-игрок # противник текущего игрока
if куча >= 103: return враг # противник только что сделал выигрышный ход
if ход > лимит: return 0 # превышено число ходов
позиции1 = [куча+1,куча+2,куча*2] # ходы: +1, +2, *2
позиции = [x for x in позиции1 if x%3 != 0] # ходы, когда результат не делится на 3
результаты = [игра(ход+1,лимит,поз) for поз in позиции] # результаты ходов
if all([рез==враг for рез in результаты]): return враг # все ходы заканчиваются выигрышем врага
if any ([рез==игрок for рез in результаты]): return игрок # у игрока есть выигрышный ход
return 0 # выигрышных ходов нет, но и не все ходы проигрышные
print('№ 19:',*[s for s in range(1,102) if s%3!=0 and игра(1,2,s)==2])
print('№ 20:',*[s for s in range(1,102) if s%3!=0 and игра(1,1,s)==0 and игра(1,3,s)==1])
print('№ 21:',*[s for s in range(1,102) if s%3!=0 and игра(1,2,s)==0 and игра(1,4,s)==2])

