Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один или четыре камня либо увеличить количество камней в куче в пять раз. Например, имея кучу из
Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, то есть не являющиеся выигрышными независимо от игры противника.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение S, когда такая ситуация возможна.
Минимальное значение: S = 3. Петя может получить
Ответ: 3.
Приведём другое решение на языке Python.
def f(x, h):
if h == 3 and x >= 68:
return 1
elif h == 3 and x < 68:
return 0
elif x >= 68 and h < 3:
return 0
else:
if h % 2 == 0:
return f(x + 1, h + 1) or f(x + 4, h + 1) or f(x * 5, h + 1) # стратегия победителя
else:
return f(x + 1, h + 1) or f(x + 4, h + 1) or f(x * 5, h + 1) # стратегия проигравшего(неудачный ход)
for x in range(1, 68):
if f(x, 1) == 1:
print(x)
break
Приведём решение Артёма Гридина на языке Python.
from functools import lru_cache
def moves(h):
return h+1, h+4, h*5
@lru_cache(None)
def game(h):
if h >= 68: return 'W'
if any(game(m) == 'W' for m in moves(h)): return 'P1'
if any(game(m) == 'P1' for m in moves(h)): return 'V1'
for s in range(1, 68):
if game(s) == 'V1':
print(s)
break
Приведём решение Виктории Зиберовой на языке Python.
def f(k, m):
if k >= 68:
return m % 2 == 0
if m == 0:
return 0
h = [f(k + 1, m - 1), f(k + 4, m - 1), f(k * 5, m - 1)]
return any(h) if m % 2 != 0 else any(h)
print('zadanie19', min([s for s in range(1, 68) if f(s, 2)]))
Приведём решение Маргариты Фалько на языке Python.
def g(s, p, end):
if s > 67:
return p in end
if p >= max(end):
return False
moves = [g(s+1, p+1, end), g(s+4, p+1, end), g(s*5, p+1, end)]
return any(moves) if ((p + 1) % 2) == (end[0] % 2) else any(moves)
print(min([s for s in range(1, 68) if g(s, 0, [2])]))

