Рассмотрим стандартную задачу ЕГЭ, немного усложним и сформулируем в рамках введенных определений
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя.
За один ход игрок может: убрать из кучи два камня или убрать из кучи пять камней или уменьшить количество камней в куче в три раза (целочисленное деление на 3).
Игра завершается, когда количество камней в куче становится не более 19.
Если при этом количество камней будет нечётным, то Победителем считается игрок, сделавший последний ход,
а если чётным, то Победителем объявляется его соперник
Определим множества G
, L
, W
и функцию pi
G
= {20, 21, ... , 2000} (2000 взято для того, чтобы рассмотреть всех ходы с глубиной ВС < 3)
L
= {1, 3, 5, 7, 9, 11, 13, 15,17, 19} - переход в L равнозначен/гарантирует Победу, поскольку Противник будет объявлен проигравшим. Для Победы игрок ДОЛЖЕН стремиться попасть в L
W
= {0, 2, 4, 6, 8, 10, 12, 14, 16, 18} - переход в W - равнозначен поражению (соперник Побеждает), значит надо избегать хода в W
- pi (pos) - возвращает множество значений pos - 2, pos - 5, pos // 3
Составим алгоримт решения задачи. Будем использовать принцип динамического программирования.
1. Инициализируем счетчик тактов работы нулем. (Такт работы это ход одного из игроков.
Петя ходит в нечётные такты, а
Ваня в чётные)
2. Организуем цикл while пока
G
не станет пустым (или на определенное число тактов - глубину просмотра). После каждого такта будем удалять из
G
некоторые элементы, перенося их в
L
или
W
Для программы нам подтребуются две подпрограмм
pi
и
step
- подпрограмма, определяющая какие элементы необходимо переместить из
G
3. Результат работы каждого такта будем записывать в словарь (ключ - номер такта)
Решение приведем для указанного примера, пункт 3 пока не будем выполнять (для ЕГЭ этого не надо)
При решении объединим множества L, W в словарь