19.01 Перекладывание камней одна куча
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень, добавить два камня или увеличить количество камней в куче в два раза. При этом не разрешается делать ход, после которого количество камней в куче будет делиться на 3.
Например, если в начале игры в куче 4 камня, Петя может первым ходом получить кучу из 5 или из 8 камней. Добавить два камня Петя не может, так как в этом случае в куче станет 6 камней, а 6 делится на 3.
Игра завершается, когда количество камней в куче становится не менее 151. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет 151 или больше камней.
В начальный момент в куче было S камней, , S не делится на 3. Будем говорить, что игрок имеет
выигрышную стратегию, если он может выиграть при любых ходах противника.
Укажите такое значение S, при котором Петя не может выиграть за один ход, но при любом ходе Пети Ваня сможет выиграть своим первым ходом.
Решение руками
Возьмём необходимое число . Поймём, когда Петя перестанет выигрывать за один ход.
, что уже меньше нужного. К тому же
кратно трём, Петя не сможет умножить на два, ведь
кратно трём. Он прибавит
или
. Если добавить единицу, то
, что даст Ване победить. Если добавить
, то
, Ваня вновь победит.
Ответ:
Решение программой:
Для решения на Python используем рекурсию с проверкой всех возможных ходов (,
,
), чтобы
определить, чья это выигрышная позиция.
Функция возвращает , если игра уже завершена (камней
), положительное число — если при оптимальной
игре побеждает текущий игрок, и отрицательное – если побеждает соперник.
Так как первый ход делает Петя, цикл запускается от его лица: если значение функции положительное, выигрвает
Пете, а если отрицательное – Ваня. Если функция вернёт - значит Петя гарантированно проиграл первым ходом,
а Ваня выиграл. При переборе возможных начальных значений программа выводит различные ответы, возьмём
.
# lru_cache позволит сэкономить ресурсы компьютера. Функция будет сохранять прошлые значения функций, а значит не придётся считать из заново. from functools import lru_cache @lru_cache(None) def game(first_heap): # Функция игры if first_heap >= 151: # Если камней в куче стало больше 151 return 0 # Прекращаем игру moves = [] # Прописываем ходы возможные в партии if (first_heap * 2) % 3 != 0: # Если новое число не делится на 3 moves.append(game(first_heap * 2)) if (first_heap + 1) % 3 != 0: # Если новое число не делится на 3 moves.append(game(first_heap + 1)) if (first_heap + 2) % 3 != 0: # Если новое число не делится на 3 moves.append(game(first_heap + 2)) petya_win = [i for i in moves if i <= 0] if petya_win: # Проверяем есть ли выигрыш Пети в данной позиции return -max(petya_win) + 1 # От лица Пети будет выигрыш (положительное число, прибавляем 1, поскольку это будет уже следующий ход) else: # Если в данной позиции выигрыш Вани return -max(moves) # От лица Пети будет проигрыш (отрицательное число) for i in range(1, 102): # Переберём возможные значения if game(i) == -1: # Если в данной позиции возможен выигрыш Вани первым ходом print(i) # Выведем нужное значение
- 74
- 75
- 78
- 81
- 84
- 87
- 90
- 93
- 96
- 99
Специальные программы

Программа
лояльности v2.0
Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!
Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение
Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты
Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей
Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ
Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!