Теория игр в ЕГЭ по информатике (задания 19–21): как решать без путаницы
· 5 мин чтения · Редакция Skill Unit
Игры считаются сложными, но чаще всего ученики путаются не в вычислениях, а в словах. «Выигрывает вторым ходом» при любой игре соперника? Или хотя бы в одной ветке? Эти формулировки определяют ответ. Разберём логику на простой игре, потом на игре с двумя кучами, как в заданиях 19–21.
Понятия: позиция, ход, выигрышная и проигрышная
Позиция — полное описание того, что на столе, например число камней в куче. Ход переводит одну позицию в другую. Побеждает тот, после чьего хода выполнено условие. В задачах про камни это почти всегда «общее число камней стало не меньше порога». Слова «не меньше» значат ≥: граница включается, и при пороге 40 позиция с 40 камнями уже победная.
- Позиция выигрышная, если из неё есть ход, после которого игра уже выиграна, либо ход в проигрышную для соперника позицию.
- Позиция проигрышная, если все её ходы ведут в выигрышные для соперника позиции.
Простая игра: считаем с конца
Одна куча из s камней. За ход можно добавить 2 камня или утроить число камней. Побеждает тот, после чьего хода в куче не менее 40 камней.
- Любая куча от 14 камней выигрышная: утроение даёт 42 и больше.
- s = 13: ход «плюс 2» даёт 15, из которой соперник утраивает и получает 45. Ход «утроить» даёт 39, из которой соперник добавляет 2 и получает 41. Оба хода отдают победу, значит 13 проигрышная.
- s = 12: ходы ведут в 14 и 36, обе позиции выигрышные для соперника, значит 12 проигрышная.
- s = 11: ход «плюс 2» ведёт в проигрышную для соперника 13, значит 11 выигрышная.
Идём вниз по значениям и записываем вердикт для каждого s. Считать нужно именно с конца: ходы только увеличивают кучу, поэтому значения больше s к этому моменту уже известны.
Игра с двумя кучами и параметром S
В заданиях 19–21 обычно две кучи, а изменяемая величина — начальное S. Возьмём игру Б: в первой куче S камней, во второй 3. За ход можно добавить 5 камней в любую одну кучу или утроить число камней в любой одной куче. Побеждает тот, после чьего хода сумма в двух кучах не менее 40. Первым ходит Петя, вторым Ваня.
Позиция теперь пара (a, b), победа проверяется по сумме a + b. Из каждой позиции у игрока четыре хода: плюс 5 к первой, плюс 5 ко второй, утроить первую, утроить вторую. Бумажное дерево глубже двух ходов рисовать не нужно: при глубине два в нём 16 партий, при глубине четыре уже 256.
Задание типа 19: два условия
Условие: найти значения S, при которых Петя не может выиграть первым ходом, но Ваня выигрывает первым ходом при любой игре Пети.
- Условие на Петю. Его самый сильный ход даёт сумму 3S + 3. Она должна быть меньше 40, значит S ≤ 12.
- Условие на Ваню. После каждого хода Пети Ваня должен суметь дойти до порога. После «плюс 5 к первой» позиция (S + 5, 3), лучший ответ — утроить первую: 3S + 18 ≥ 40, откуда S ≥ 8. После «плюс 5 ко второй» позиция (S, 8): утроить первую даёт 3S + 8 ≥ 40, откуда S ≥ 11. После «утроить первую» позиция (3S, 3): утроение первой даёт 9S + 3 ≥ 40, откуда S ≥ 5. После «утроить вторую» позиция (S, 9): 3S + 9 ≥ 40, откуда S ≥ 11.
Итог: нужно одновременно S ≤ 12 и S ≥ 11. Подходят значения 11 и 12: наибольшее 12, наименьшее 11.
Две частые ошибки. Первая: проверить только «лучший» ход Пети. Условие «при любой игре Пети» требует перебрать все ходы, потому что Петя выберет худший для Вани. Вторая: забыть условие, что Петя сам не побеждает первым ходом: тогда в ответ попадают слишком большие S.
Когда ходов много: универсальная функция
Неравенствами удобно рассуждать, пока ходов мало. Если глубже на ход или множители разные, надёжнее написать функцию win(p, left): может ли игрок, который ходит из позиции p, гарантированно выиграть не позже чем своим left-м ходом при любой игре соперника. Игрок пробует каждый ход q. Если q сразу даёт победу, возвращаем True. Иначе, если ходы ещё остались, смотрим все ответы соперника: ход q хорош, если ни один ответ не побеждает сразу и после любого ответа игрок снова выигрывает за left − 1 ходов.
Через win записываются все типы условий. Тип 19 для начальной позиции — «ходящий проигрывает в пределах одного хода соперника». Тип 20 в строгой формулировке — для каждого хода q выполнено not win(q, 1) и win(q, 2). Тип 21 шире: он включает значения типа 20, потому что «выигрывает не позже второго хода» допускает ветки, где можно выиграть и первым.
Ловушки
- Граница порога: «не менее 40» — это >= 40, а не > 40.
- Ходы в разные кучи: «добавить в любую кучу» — два хода, а не один.
- Квантор: «при любой игре Пети» — это all(...), а не any(...).
- Диапазон S: начальная позиция не должна быть победной сразу.
- Глубина: win(p, 2) уже включает победу за один ход, поэтому для строгого типа нужно добавлять not win(q, 1).
Что делать дальше
Решите игру Б бумагой, а затем напишите функцию и сравните ответы: у вас должны получиться те же 11 и 12. После этого поменяйте параметры (порог, добавку, множитель) и убедитесь, что программа справляется. В курсе «ЕГЭ по информатике» на Skill Unit теории игр посвящён отдельный урок с готовыми листингами на Python, практикой и проверкой.
Хотите пройти путь на практике?
Курс «ЕГЭ по информатике»: короткие уроки, практические задания и проверка ответов. Первый урок бесплатно.
Смотреть курс