21. Выигрышная стратегия: часть 3: #295310
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети.
Для игры, описанной в задании $19$, найдите наименьшее значение $S$, при котором одновременно выполняются два условия:
- у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
- у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Если найдено несколько значений $S$, в ответе запишите наименьшее из них.
Первый способ – математическое решение
Минимальное подходящее значение: $S=28$.
После первого хода Пети возможны позиции: $(10;28),\ (8;30),\ (24;28),\ (8;84)$.
Из позиций $(8;30)$, $(24;28)$ и $(8;84)$ Ваня выигрывает сразу:
$(8;30)\rightarrow(8;90)$, сумма $98$;
$(24;28)\rightarrow(72;28)$, сумма $100$;
$(8;84)\rightarrow(24;84)$, сумма $108$.
Если Петя получил $(10;28)$, Ваня делает ход: $(10;28)\rightarrow(12;28)$.
После этого Петя может получить: $(14;28),\ (12;30),\ (36;28),\ (12;84)$.
Из каждой такой позиции Ваня выигрывает следующим ходом:
- $(14;28)\rightarrow(14;84)$, сумма $98$;
- $(12;30)\rightarrow(12;90)$, сумма $102$;
- $(36;28)\rightarrow(108;28)$, сумма $136$;
- $(12;84)\rightarrow(14;84)$, сумма $98$.
При этом после хода Пети $(8;28)\rightarrow(10;28)$ Ваня не может выиграть сразу, поэтому гарантированной победы первым ходом у него нет.
Второй способ – решение с помощью Python
def moves(a, b):
return [(a + 2, b), (a, b + 2),
(a * 3, b), (a, b * 3)]
def win1(a, b):
return a + b < 97 and any(
x + y >= 97 for x, y in moves(a, b)
)
def win2(a, b):
if win1(a, b):
return True
return any(
all(
x + y < 97 and win1(x, y)
for x, y in moves(c, d)
)
for c, d in moves(a, b)
if c + d < 97
)
for S in range(1, 89):
petya = moves(8, S)
if (
all(a + b < 97 and win2(a, b) for a, b in petya)
and not all(win1(a, b) for a, b in petya)
):
print(S)
break
Программа проверяет, что после любого хода Пети Ваня может выиграть первым или вторым ходом, но не может гарантированно выиграть своим первым ходом.
Программа выведет: $28$.