Добрый вечер, решала задачу, но получаются лишние ответы в 21 задаче. Правильные ответы в этой задаче: 7 и 19.
А у меня получаются ответы: 5, 7, 19, 21.
(№ 6103) (А. Богданов) Два игрока, Петя и Ваня, играют в следующую игру.
Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя.
За один ход игрок может добавить в меньшую кучу один или три камня.
Изменять количество камней в большей куче не разрешается. Игра завершается, когда
количество камней в кучах становится равным
Победителем считается игрок, сделавший последний ход, то есть первым сравнявшим
количество камней в двух кучах. Игроки играют рационально, т. е. без ошибок.
В начальный момент в первой куче было 13 камней,а во второй – S камней, 1 ≤ S ≤ 23.
Ответьте на следующие вопросы:
Вопрос 3.
Найдите два значения S, при которых одновременно выполняются три условия:
– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом
при любой игре Пети;
– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом;
– Петя может выбирать, каким ходом выиграет Ваня.
Найденные значения запишите в ответе в порядке возрастания.
Помогите, пожалуйста, понять почему.
...
def f(s1, s2, step, win_steps):
if s1 == s2:
return step in win_steps
if step == max(win_steps):
return 0
if s1 < s2:
wins_pos = [f(s1 + 1, s2, step + 1, win_steps), f(s1 + 3, s2, step + 1, win_steps)]
else:
wins_pos = [f(s1, s2 + 1, step + 1, win_steps), f(s1, s2 + 3, step + 1, win_steps)]
if step % 2 != max(win_steps) % 2: # ходит тот игрок, чья победа нужна
return any(wins_pos)
else:
return all(wins_pos)
s1 = 13
print('* * * Задача 21 * * *')
for s2 in range(1, 23 + 1):
if f(s1, s2, 0, [2]) == 0 and f(s1, s2, 0, [2, 4]) == 1 and f(s1, s2, 0, [1, 3]) == 0:
print(s2)