Задание №19: Теория игр: выигрышная стратегия (1 ход)
Основные типы и прототипы задания №19:
Одна куча камней (Победа за 1 ход)
Две кучи камней (Победа Вани за 1 ход)
Условие задания
(Е. Джобс) Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу 10 камней или увеличить количество камней в куче в два раза. Игра завершается в тот момент, когда количество камней в куче становится не менее 82. Игрок, сделавший ход, который привел к значению 82 или более, считается проигравшим. В начальный момент в куче было S камней, 1 ≤ S ≤ 81.
Ответьте на следующие вопросы:
Вопрос 1. Известно, что Петя одержал победу, совершив один ход за игру. Найдите минимальное значение S, при котором Петя гарантированно одерживает победу.
Вопрос 2. Найдите все значения S такие, при которых Ваня совершает не более одного хода и выигрывает. При этом у Вани нет стратегии, которая позволяла бы ему гарантированно выиграть, не совершив ни одного хода. В качестве ответа приведите минимальное и максимальное значения S.
Вопрос 3. Известно, что Петя выигрывает, сделав не более двух ходов. Укажите минимальное значение S, если известно, что Петя не может гарантированно выиграть, сделав один ход.
Ответьте на следующие вопросы:
Вопрос 1. Известно, что Петя одержал победу, совершив один ход за игру. Найдите минимальное значение S, при котором Петя гарантированно одерживает победу.
Вопрос 2. Найдите все значения S такие, при которых Ваня совершает не более одного хода и выигрывает. При этом у Вани нет стратегии, которая позволяла бы ему гарантированно выиграть, не совершив ни одного хода. В качестве ответа приведите минимальное и максимальное значения S.
Вопрос 3. Известно, что Петя выигрывает, сделав не более двух ходов. Укажите минимальное значение S, если известно, что Петя не может гарантированно выиграть, сделав один ход.
Ответ:
1) 36<br/>2) 52 61<br/>3) 26
Шаблон решения на Python
# === Задания 19-21: Теория игр (1 или 2 кучи) ===
def moves(h):
return [h + 1, h * 2]
def game(h):
if h >= 129: return 0 # Победа
next_g = [game(m) for m in moves(h)]
if any(g == 0 for g in next_g): return 1 # Победа 1 ходом (П1)
if all(g == 1 for g in next_g): return 2 # Победа 1 ходом (В1)
if any(g == 2 for g in next_g): return 3 # Победа 2 ходом (П2)
if all(g in (1, 3) for g in next_g): return 4 # Победа 2 ходом (В2)
return -1
for s in range(1, 129):
res = game(s)
if res in (1, 2, 3, 4):
print(f"S={s}: {['П1', 'В1', 'П2', 'В2'][res-1]}")