21. Выигрышная стратегия: часть 3: #295299
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети.
Для игры, описанной в задании $19$, найдите наименьшее значение $S$, при котором одновременно выполняются два условия:
- у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
- у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Если найдено несколько значений $S$, в ответе запишите наименьшее из них.
Первый способ – математическое решение
Минимальное подходящее значение: $S=41$.
После первого хода Пети возможны позиции: $(9;41),\ (7;43),\ (14;41),\ (7;82)$.
Из позиции $(7;82)$ Ваня выигрывает сразу.
Если Петя получил $(9;41)$, Ваня удваивает первую кучу: $(9;41)\rightarrow(18;41)$.
После этого Петя может получить: $(20;41),\ (18;43),\ (36;41),\ (18;82)$.
Из каждой такой позиции Ваня выигрывает следующим ходом:
- $(20;41)\rightarrow(20;82)$, сумма $102$;
- $(18;43)\rightarrow(18;86)$, сумма $104$;
- $(36;41)\rightarrow(36;82)$, сумма $118$;
- $(18;82)\rightarrow(20;82)$, сумма $102$.
Если Петя получил $(7;43)$ или $(14;41)$, Ваня переводит игру в позицию $(14;43)$, после которой также гарантированно выигрывает своим вторым ходом.
При этом после хода Пети $(7;41)\rightarrow(9;41)$ Ваня не может выиграть сразу, поэтому гарантированной победы первым ходом у него нет.
Второй способ – решение с помощью Python
def moves(a, b):
return [(a + 2, b), (a, b + 2),
(a * 2, b), (a, b * 2)]
def win1(a, b):
return a + b < 101 and any(
x + y >= 101 for x, y in moves(a, b)
)
def win2(a, b):
if win1(a, b):
return True
return any(
all(
x + y < 101 and win1(x, y)
for x, y in moves(c, d)
)
for c, d in moves(a, b)
if c + d < 101
)
for S in range(1, 94):
petya = moves(7, S)
if (
all(a + b < 101 and win2(a, b) for a, b in petya)
and not all(win1(a, b) for a, b in petya)
):
print(S)
break
Программа проверяет, что после любого хода Пети Ваня может выиграть первым или вторым ходом, но не может гарантированно выиграть своим первым ходом.
Программа выведет: $41$.