21. Выигрышная стратегия: часть 3: #295313
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя.
Для игры, описанной в задании $19$, найдите минимальное значение $S$, при котором одновременно выполняются два условия:
- у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
- у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Если найдено несколько значений $S$, в ответе запишите наименьшее из них.
Первый способ – математическое решение
Минимальное подходящее значение: $S=22$.
После первого хода Пети возможны позиции: $22\rightarrow24,\ 27,\ 44$.
Если Петя получил $44$ камня, Ваня выигрывает сразу: $44\rightarrow88$.
Если Петя получил $24$ камня, Ваня делает ход: $24\rightarrow29$.
Если Петя получил $27$ камней, Ваня также получает: $27\rightarrow29$.
После позиции $29$ Петя может получить: $29\rightarrow31,\ 34,\ 58$.
Из каждой такой позиции Ваня выигрывает следующим ходом:
$31\rightarrow62$;
$34\rightarrow68$;
$58\rightarrow63$.
При этом после хода Пети $22\rightarrow24$ Ваня не может выиграть сразу, поэтому гарантированной победы первым ходом у него нет.
Для $S<22$ оба условия одновременно не выполняются.
Второй способ – решение с помощью Python
def moves(x):
return [x + 2, x + 5, x * 2]
def win1(x):
return x < 61 and any(
y >= 61 for y in moves(x)
)
def win2(x):
if win1(x):
return True
return any(
y < 61 and all(
z < 61 and win1(z)
for z in moves(y)
)
for y in moves(x)
)
for S in range(1, 61):
if (
all(x < 61 and win2(x) for x in moves(S))
and not all(win1(x) for x in moves(S))
):
print(S)
break
Программа проверяет, что после любого хода Пети Ваня может выиграть первым или вторым ходом, но не может гарантированно выиграть своим первым ходом.
Программа выведет: $22$.