Задача к ЕГЭ по информатике на тему «перекладывание камней одна куча» №1

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу 1 или 3 камня. Например, имея кучу из 12 камней, за один ход можно получить кучу из 13 или 15. У каждого игрока, чтобы делать ходы, есть неограниченное количество камней. Игра завершается в тот момент, когда количество камней в куче становится не менее 45. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет 45 или больше камней. В начальный момент в куче было 1 ≤ S < 45  . Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока – значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т.е. не являющиеся выигрышными независимо от игры противника.

Укажите все значения S, при которых Петя выигрывает своим первым ходом. Числа в ответе запишите в порядке возрастания без пробелов и разделителей.

Решение руками

Максимальный ход доступный нам в партии это + 3  . Минимальное значение отрезка значений, в которых Петя побеждает первым ходом равняется: 45− 3 = 42

Получается, что в отрезке [42;44] Петя выигрывает своим первым ходом.

Ответ: 424344

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 45: # если камней в куче стало больше 44
        return 0 # прекращаем игру
    moves = [game(first_heap+1),game(first_heap+3)] # расписываем ходы доступные нам в партии
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # проверяем есть ли выигрыш Пети в данной позиции
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,45):
    if game(i) == 1: # если в данной позиции возможен выигрыш Пети первым ходом
        print(i)

Ответ: 424344
Оцените статью
Я решу все!