Задание 19 - Информатика

← Вернуться к списку заданий

Условие задачи

ID Задания: DOSR2319_1

(ДОСРОК 2023) Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень, четыре камня или увеличить количество камней в куче в четыре раза. У каждого игрока есть неограниченное количество камней, чтобы делать ходы. Игра завершается в тот момент, когда количество камней в куче становится не менее 78. Победителем считается игрок, сделавший последний ход, т.е. первым получивший кучу из 78 или более камней.

В начальный момент в куче было S камней, 1 ≤ S ≤ 37.

Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. 

 

  1. Укажите минимальное значение S, при котором Ваня может выиграть своим первым ходом после любого хода Пети.

2. Для игры, описанной в предыдущем задании, найдите минимальное значение S, при котором у Пети есть выигрышная стратегия, чтобы победить вторым ходом, при этом он не может гарантированно выиграть за один ход.

3. Для игры, описанной в задании 19, найдите минимальное значение S, при котором одновременно выполняются два условия:

— у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;

— у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

Ответ: 19

Комментарий

Решение 1:

 

Python:

from functools import*

 

def m(h):

   return h+1, h+4, h*4

 

@lru_cache(None)

def g(h):

   if h>=78:

       return 'w'

   if any(g(i) == 'w' for i in m(h)):

       return 'p1'

   if all(g(i) == 'p1' for i in m(h)):

       return 'v1'

   if any(g(i) == 'v1' for i in m(h)):

       return 'p2'

   if all(g(i) == 'p1' or g(i) == 'p2' for i in m(h)):

       return 'v1/2'

 

for i in range(1, 38):

   if g(i) == 'v1':

       print(i)

 

Решение 2:

 

Python:

from functools import*

def m(h):

   return h+1, h+4, h*4

@lru_cache(None)

def g(h):

   if h>=78:

       return 'w'

   if any(g(i) == 'w' for i in m(h)):

       return 'p1'

   if all(g(i) == 'p1' for i in m(h)):

       return 'v1'

   if any(g(i) == 'v1' for i in m(h)):

       return 'p2'

   if all(g(i) == 'p1' or g(i) == 'p2' for i in m(h)):

       return 'v1/2'

for i in range(1, 38):

   if g(i) == 'p2':

       print(i)

 

Решение 3:

from functools import*

 

def m(h):

   return h+1, h+4, h*4

 

@lru_cache(None)

def g(h):

   if h>=78:

       return 'w'

   if any(g(i) == 'w' for i in m(h)):

       return 'p1'

   if all(g(i) == 'p1' for i in m(h)):

       return 'v1'

   if any(g(i) == 'v1' for i in m(h)):

       return 'p2'

   if all(g(i) == 'p1' or g(i) == 'p2' for i in m(h)):

       return 'v1/2'

 

for i in range(1, 38):

   if g(i) == 'v1/2':

       print(i)

 

Решение Excel: 19-21.1

Похожие задания

Задание 19 Задание 19 Задание 19 Задание 19 Задание 19