Решение ✅ Задание 19-21. Python. № 3084. (А. Кабанов) Задачи с одной кучей камней.
Предметы
Задание 19-21. Python. № 3084. (А. Кабанов) Задачи с одной кучей камней.
2 оценки, среднее: 4,50 из 52 оценки, среднее: 4,50 из 52 оценки, среднее: 4,50 из 52 оценки, среднее: 4,50 из 52 оценки, среднее: 4,50 из 5
Загрузка...

Задача № 3084

Задание КИМ № 19: Теория игр
Раздел № 163: Задачи с одной кучей камней (ответ — число)

(А. Кабанов) Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может
а) добавить в кучу один камень;
б) увеличить количество камней в куче в два раза;
в) увеличить количество камней в куче в три раза.
Игра завершается в тот момент, когда количество камней в куче становится не менее 43. Если при этом в куче оказалось не более 72 камней, то победителем считается игрок, сделавший последний ход. В противном случае победителем становится его противник. В начальный момент в куче было S камней, 1 ≤ S ≤ 42.
Ответьте на следующие вопросы:
Вопрос 1. Найдите минимальное значение S, при котором Ваня выигрывает своим первым ходом при любой игре Пети.
Вопрос 2. Сколько существует значений S, при которых у Пети есть выигрышная стратегия, причём одновременно выполняются два условия:
− Петя не может выиграть за один ход;
− Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.
Вопрос 3. Найдите минимальное и максимальное значения S, при которых одновременно выполняются два условия:
– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Найденные значения запишите в ответе в порядке возрастания.

 

Данная задача решена на языке программирования - Python.

from functools import lru_cache
def sh(h): 
    return h+1,h*2,h*3 @lru_cache(None) 
def f(h): 
    if h>42 and h<=72: 
        return 'выиграл' 
    elif h>72: 
        return 'проиграл' 
    elif any(f(x)=='выиграл' for x in sh(h)): 
        return 'П1' 
    elif all(f(x)=='П1' for x in sh(h)): 
        return 'B1' 
    elif any(f(x)=='B1' for x in sh(h)): 
        return 'П2' 
    elif all(f(x)=='П2' or f(x)=='П1' for x in sh(h)): 
        return 'В2' 
for i in range(1,43): 
    print(i,' ',f(i)

Ответ:

1) 14 2) 3 3) 12 39

Формат файла

Источник

сайт Полякова

Создание сайтов - Лидер Поиска

Refund Reason