← Все вопросы

Как решать задания 19, 20, 21 ЕГЭ (теория игр, выигрышная стратегия)?

Задан 7 месяцев назад1.4к просмотров2 ответа
11

Задания 19-21 про игру двух игроков с камнями в кучах: кто-то выигрывает первым или вторым ходом. Понятия «выигрышная стратегия» и «позиция» путаются. Как решать теорию игр на ЕГЭ через Python?

2 ответа

15
✓ Принятый ответ — помог автору

Задания 19–21 — игра двух игроков (камни в куче/кучах, ходы по правилам: добавить, умножить). Нужно определить, кто и за сколько ходов выигрывает.

Понять две вещи:

  • Выигрышная позиция — из неё ИГРОК, ЧЕЙ ХОД, может победить при правильной игре.
  • Проигрышная (выигрышна для соперника) — любой ход ведёт в выигрышную для другого.

Универсальный способ — рекурсия с мемоизацией. Описываешь правила ходов и финал, а функция сама ищет, кто побеждает:

from functools import lru_cache

MOVES = lambda s: [s+1, s+2, s*2]   # ходы из условия
WIN = lambda s: s >= 35             # условие конца игры

@lru_cache(None)
def win(s):              # может ли победить тот, чей ход
    if WIN(s):
        return False     # игра кончилась — текущий уже не ходит
    return any(not win(ns) for ns in MOVES(s))

Дальше:

  • 19 (выигрыш первого за 1 ход): среди ходов первого есть сразу финал.
  • 20/21 — формализуй «выигрыш не позже 2-го хода» через глубину/чётность. Удобно завести функцию, возвращающую за сколько ходов выигрыш.

Частые ошибки:

  • путать «выигрывает Петя/Ваня» (первый/второй игрок) и чей сейчас ход;
  • неверно задать условие окончания (>= S камней) и набор ходов;
  • забыть мемоизацию — на больших числах долго.

Главное — точно перенести правила ходов и финал. Логику «кто победит» Python выведет сам.

6

Если страшно писать рекурсию — задания 19–21 решаются и через дерево игры на бумаге для маленьких начальных значений: расписываешь все ходы на 1–2 шага вперёд и смотришь, кто приходит к победе.

Но на КЕГЭ перебор на Python надёжнее: главное — корректно задать правила ходов из условия и условие выигрыша (обычно «куча достигла S камней»). Заведи функцию «выигрывает ли текущий игрок» и для 20/21 считай минимальное число ходов до победы.

Ваш ответ

Войдите, чтобы ответить на вопрос.