Для игры, описанной в задании выше, укажите два значения S, при которых у Вани есть выигрышная стратегия, позволяющая ему выиграть третьим ходом при любой игре Пети, но у Вани нет стратегии, которая позволяла бы ему гарантированно выиграть первым или вторым ходом. В ответе запишите найденные значения в порядке возрастания без пробелов и разделителей.
Решение программой
from functools import lru_cache
lru_cache(None)
def f(a,c=0,lastP1 = ’’,lastP2= ’’):# В данной программе нам понадобятся дополнительные параметры,а именно, параметр ’c’ - счётчик ходов, с помощью него будем определять чей сейчас ход. Если число ’c’ чётное,то сейчас ход Пети,иначе Вани.
#Понадобятся также 2 параметра: lastP1 и lastP2. Они содержат в себе последний ход каждого из игрока.
if a >= 68:return 0
if c % 2 == 0 and lastP1 == ’’: #В свой первый ход Петя может сделать любой ход
t = [f(a+3,c+1,’+3’,lastP2),f(a+6,c+1,’+6’,lastP2),f(a*3,c+1,’*3’,lastP2)]
if c % 2 == 0 and lastP1 == ’+3’:
t = [f(a+6,c+1,’+6’,lastP2),f(a*3,c+1,’*3’,lastP2)]
if c % 2 == 0 and lastP1 == ’+6’:
t = [f(a+3,c+1,’+3’,lastP2),f(a*3,c+1,’*3’,lastP2)]
if c % 2 == 0 and lastP1 == ’*3’:
t = [f(a+3,c+1,’+3’,lastP2),f(a+6,c+1,’+6’,lastP2)]
if c % 2 != 0 and lastP2 == ’’: #В свой первый ход Ваня может сделать любой ход
t = [f(a + 3, c + 1, lastP1, ’+3’), f(a + 6, c + 1, lastP1, ’+6’), f(a * 3, c + 1, lastP1, ’*3’)]
if c % 2 != 0 and lastP2 == ’+3’:
t = [f(a + 6, c + 1, lastP1, ’+6’), f(a * 3, c + 1, lastP1, ’*3’)]
if c % 2 != 0 and lastP2 == ’+6’:
t = [f(a + 3, c + 1, lastP1, ’+3’), f(a * 3, c + 1, lastP1, ’*3’)]
if c % 2 != 0 and lastP2 == ’*3’:
t = [f(a + 3, c + 1, lastP1, ’+3’), f(a + 6, c + 1, lastP1, ’+6’)]
n = [i for i in t if i <= 0]
if n:return -max(n) + 1
return -max(t)
for i in range(1,69):
if f(i) == -3:
print(i)
Ответ: 12