ЕГЭ по информатике 2026 · задание 21 из 27
ЕГЭ по информатике 2026, задание 21: дерево игры
Задание 21 — повышенный уровень, 1 балл, та же партия. Часто нужно значение S, при котором у Вани есть выигрышная стратегия, а у Пети нет стратегии выиграть раньше, чем за два своих хода, и спрашивают конкретное S или два значения.
Если ответ не виден из решения №20, ФИПИ рекомендует дерево: полное или неполное, схема или таблица на черновике. Неполное дерево допустимо, только если вы осознанно отсекаете ветки, которые не меняют вывод. «Не смотрел вторую кучу» — не отсечение, а ошибка.
Конспект
Вопрос №21 обычно на ход длиннее, чем №20. Ваня выигрывает своим вторым ходом, когда:
- Петя не может закончить игру раньше;
- как бы Петя ни ходил первым ходом, Ваня может ответить так, чтобы дальше у Пети не было спасения, и Ваня завершит игру на своём втором ходу.
Слова «при любом ходе Пети» и «Ваня может выбрать» не меняются местами. Существование хода у проигрывающего не спасает его, если есть и плохие ходы: смотрят, может ли он выбрать хороший. У выигрывающего достаточно одного правильного ответа на каждый чужой ход.
Неполное дерево: сначала выпишите ходы Пети из стартового S. Если хотя бы на один ход Пети у Вани нет нужного ответа, S не подходит, дальше эту ветку не рисуйте. Если все первые ходы Пети разобраны и на каждый есть ответ, позиция годится.
Не переносите S из №20 в №21 без чтения вопроса. Иногда просят те же числа, иногда следующее по величине, иногда позицию, где выигрывает уже второй игрок.
Шаблон на Python
Здесь рекурсия с глубиной хода. turns=4 — четыре полухода, то есть второй ход Вани. Подстройте функцию под формулировку: кто выигрывает и не раньше какого хода.
GOAL = 129
memo = {}
def moves(s):
return [s + 1, s * 2]
def wins(s, turns_left):
key = (s, turns_left)
if key in memo:
return memo[key]
if s >= GOAL or turns_left == 0:
memo[key] = False
return False
# текущий игрок выигрывает, если может сразу закончить
# или оставить сопернику позицию, где тот не выигрывает
result = False
for m in moves(s):
if m >= GOAL or not wins(m, turns_left - 1):
result = True
break
memo[key] = result
return result
# позиции, где первый не выигрывает за 1 и за 3 полухода,
# но второй выигрывает: проверяйте по точной формулировке варианта
for s in range(1, GOAL):
if any(m >= GOAL for m in moves(s)):
continue
print(s, wins(s, 1), wins(s, 3))Готовый print не копируйте в бланк. Сначала сопоставьте «победа за 3 полухода» с текстом: чей это ход и исключены ли более ранние победы. Шаблон считает факт победы не позднее заданной глубины. Для №21 почти всегда нужно ещё отсечь более быстрые победы.
Типичные ошибки
- Дерево оборвано на ходе, где соперник ещё мог спастись.
- Победа за 2 хода второго игрока смешана с победой за 2 хода первого.
- Из №20 переписаны числа без проверки, что вопрос другой.
- В двух кучах ход применён к обеим сразу.
Попробуйте объяснить с Мишкой
Бесплатный ИИ-репетитор объяснит любую тему так, как вам понятно — шаг за шагом.
Начать бесплатно