Решение 1. Анализ через f(a, b, m)
🔹 Шаг 1. Создаем рекурсивную функцию
def f(a, b, m):
📌 Функция определяет, может ли текущий игрок гарантированно победить, если до окончания анализа осталось m ходов.
🔹 Шаг 2. Проверяем окончание игры
if a + b >= 65 or m < 0:
📌 Если сумма камней уже достигла 65 или количество оставщихся ходов закончилось, рекурсия завершается.
🔹 Шаг 3. Возвращаем результат
return m % 2 == 0
📌 Если игра закончилась на нужной глубине рекурсии, возвращается True, иначе False. Чётность m показывает, чей ход оказался победным.
🔹 Шаг 4. Перебираем все возможные ходы
h = f(a + 1, b, m - 1), f(a * 3, b, m - 1), f(a, b + 1, m - 1), f(a, b * 3, m - 1)
📌 Из каждой позиции можно выполнить четыре действия: +1 или ×3 для первой или второй кучи.
🔹 Шаг 5. Выбираем any
return any(h)
📌 Для задания 19 с «неудачного» хода Пети достаточно существования хотя бы одного выигрышного хода (any).
✅ Задание 19
📌 Найти минимальное S, при котором после неудачного первого хода Пети Ваня выигрывает своим первым ходом.
print(19, [s for s in range(1, 59) if f(6, s, 2)])
📌 Перебираем все значения S от 1 до 58 и проверяем позиции глубиной 2 хода (f(6, S, 2)). Из найденных значений выбираем минимальное: 7.
🔹 Для заданий 20 и 21 меняем any на any/all
return any(h) if (m - 1) % 2 == 0 else all(h)
📌 На своём ходу достаточно одного выигрышного варианта (any), на ходе соперника победа должна сохраняться после любого ответа (all).
✅ Задание 20
📌 Найти два минимальных S, когда Петя не выигрывает сразу, но гарантированно выигрывает своим вторым ходом.
print([s for s in range(1, 59) if not f(6, s, 1) and f(6, s, 3)])
📌 not f(6, S, 1) — победить первым ходом нельзя; f(6, S, 3) — существует стратегия выигрыша вторым ходом. Берём два первых найденных значения: 10 и 19.
✅ Задание 21
📌 Найти минимальное S, когда Ваня выигрывает первым или вторым ходом, но не имеет гарантированной победы первым ходом.
print([s for s in range(1, 59) if not f(6, s, 2) and f(6, s, 4)])
📌 not f(6, S, 2) — Ваня не может гарантированно выиграть первым ходом; f(6, S, 4) — Ваня гарантированно выигрывает первым или вторым ходом. Ответ: 18.