Задания
Версия для печати и копирования в MS Word
Тип 21 № 47018
i

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

На­при­мер, если в на­ча­ле игры в куче 3 камня, Петя может пер­вым ходом по­лу­чить кучу из 4, 5 или 6 кам­ней. Если Петя по­лу­чил кучу из 5 кам­ней (до­ба­вил два камня), то сле­ду­ю­щим ходом Ваня может по­лу­чить 6, 7 или 10 кам­ней. Если Ваня до­ба­вил один ка­мень и по­лу­чил 6 кам­ней, то вто­рым ходом Петя может по­лу­чить 7 или 12 кам­ней. По­лу­чить 8 кам­ней Петя не может, так как для этого нужно до­ба­вить 2 камня, а Петя делал это на преды­ду­щем ходу.

Чтобы де­лать ходы, у каж­до­го иг­ро­ка есть не­огра­ни­чен­ное ко­ли­че­ство кам­ней.

Игра за­вер­ша­ет­ся, когда ко­ли­че­ство кам­ней в куче ста­но­вит­ся не менее 29. По­бе­ди­те­лем счи­та­ет­ся игрок, сде­лав­ший по­след­ний ход, то есть пер­вым по­лу­чив­ший кучу, в ко­то­рой будет 29 или боль­ше кам­ней. В на­чаль­ный мо­мент в куче было S кам­ней; 1 ⩽ S ⩽ 28.

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

Най­ди­те наи­боль­шее зна­че­ние S, при ко­то­ром у Пети есть вы­иг­рыш­ная стра­те­гия, поз­во­ля­ю­щая ему вы­иг­рать тре­тьим ходом при любой игре Вани, но у Пети нет стра­те­гии, ко­то­рая поз­во­ля­ла бы ему га­ран­ти­ро­ван­но вы­иг­рать пер­вым или вто­рым ходом.

Спрятать решение

Ре­ше­ние.

Такое зна­че­ние S  — 9. При S  =  9 Петя своим пер­вым ходом может по­лу­чить по­зи­цию 11. Ваня своим пер­вым ходом может по­лу­чить одну из по­зи­ций 12, 13 и 22. В по­зи­ции 22 Петя своим вто­рым ходом удва­и­ва­ет ко­ли­че­ство кам­ней в куче и вы­иг­ры­ва­ет своим вто­рым ходом. В по­зи­ци­ях 12 и 13 Петя своим вто­рым ходом до­бав­ля­ет в кучу один ка­мень и по­лу­ча­ет по­зи­ции 13 и 14 со­от­вет­ствен­но. В по­зи­ции 13 Ваня своим вто­рым ходом может по­лу­чить по­зи­ции 15 и 26 (по­зи­цию 14 Ваня по­лу­чить не может, по­сколь­ку иг­ро­ку нель­зя по­вто­рять свои преды­ду­щие ходы). В по­зи­ции 14 Ваня своим вто­рым ходом может по­лу­чить по­зи­ции 15 и 28 (по­зи­цию 16 Ваня по­лу­чить не может, по­сколь­ку иг­ро­ку нель­зя по­вто­рять свои преды­ду­щие ходы). Во всех четырёх слу­ча­ях Петя удва­и­ва­ет ко­ли­че­ство кам­ней в куче и вы­иг­ры­ва­ет своим тре­тьим ходом.

 

Ответ: 9.

 

При­ведём дру­гое ре­ше­ние на языке Python.

 

Заведём пе­ре­мен­ные, от­сле­жи­ва­ю­щие сде­лан­ные ходы.

Так можно ис­клю­чать ходы, ко­то­рые уже были сде­ла­ны, не вклю­чая их в воз­вра­ща­е­мые зна­че­ния функ­ции.

Сна­ча­ла найдём стра­те­гии по­бе­ды Пети пер­вым, вто­рым или тре­тьим ходом.

Далее ис­клю­чим по­бе­ду Пети толь­ко пер­вым и толь­ко вто­рым ходом.

# По­бе­да Пети пер­вым или вто­рым, или тре­тьим ходом

def f(x, h, p, v):

if (h == 2 or h == 4 or h == 6) and x >= 29:

return 1

elif h == 6 and x < 29:

return 0

elif x >= 29 and h < 6:

return 0

else:

if h % 2 == 0:

if h == 2:

return f(x + 1, h + 1, p, 1) and f(x + 2, h + 1, p, 2) and f(x * 2, h + 1, p, 3) # стра­те­гия про­иг­рав­ше­го

elif h == 4:

if v == 1:

return f(x + 2, h + 1, p, v) and f(x * 2, h + 1, p, v)

elif v == 2:

return f(x + 1, h + 1, p, v) and f(x * 2, h + 1, p, v)

elif v == 3:

return f(x + 1, h + 1, p, v) and f(x + 2, h + 1, p, v)

else: # Петин ход

if h == 1:

return f(x + 1, h + 1, 1, v) or f(x + 2, h + 1, 2, v) or f(x * 2, h + 1, 3, v) # стра­те­гия по­бе­ди­те­ля

elif h == 3:

if p == 1:

return f(x + 2, h + 1, 2, v) or f(x * 2, h + 1, 3, v)

elif p == 2:

return f(x + 1, h + 1, 1, v) or f(x * 2, h + 1, 3, v)

elif p == 3:

return f(x + 1, h + 1, 1, v) or f(x + 2, h + 1, 2, v)

elif h == 5:

if p == 1:

return f(x + 2, h + 1, p, v) or f(x * 2, h + 1, p, v)

elif p == 2:

return f(x + 1, h + 1, p, v) or f(x * 2, h + 1, p, v)

elif p == 3:

return f(x + 1, h + 1, p, v) or f(x + 2, h + 1, p, v)

for x in range(1, 29):

if f(x, 1, 0, 0) == 1:

print("За­да­ча 21:", x)

 

# Ис­клю­ча­ем по­бе­ду Пети толь­ко пер­вым ходом

def f(x, h):

if h == 2 and x >= 29:

return 1

elif h == 2 and x < 29:

return 0

elif x >= 29 and h < 2:

return 0

else:

if h % 2 != 0:

return f(x + 1, h + 1) or f(x + 2, h + 1) or f(x * 2, h + 1) # стра­те­гия по­бе­ди­те­ля

else:

return f(x + 1, h + 1) and f(x + 2, h + 1) and f(x * 2, h + 1) # стра­те­гия про­иг­рав­ше­го(любой ход)

 

for x in range(1, 29):

if f(x, 1) == 1:

print("По­бе­да Пети пер­вым ходом:", x)

 

# По­бе­да Пети вто­рым ходом

def f(x, h, m):

if h == 4 and x >= 29:

return 1

elif h == 4 and x < 29:

return 0

elif x >= 29 and h < 4:

return 0

else:

if h % 2 != 0:

if h == 1:

return f(x + 1, h + 1, 1) or f(x + 2, h + 1, 2) or f(x * 2, h + 1, 3) # стра­те­гия по­бе­ди­те­ля

elif h == 3:

if m == 1:

return f(x + 2, h + 1, m) or f(x * 2, h + 1, m)

elif m == 2:

return f(x + 1, h + 1, m) or f(x * 2, h + 1, m)

elif m == 3:

return f(x + 1, h + 1, m) or f(x + 2, h + 1, m)

else:

return f(x + 1, h + 1, m) and f(x + 2, h + 1, m) and f(x * 2, h + 1, m)

 

for x in range(1, 29):

if f(x, 1, 0) == 1:

print("По­бе­да Пети вто­рым ходом:", x)

 

При­ведём ре­ше­ние Юрия Кра­силь­ни­ко­ва на языке Python.

def move(n,lim,s,t):

player = 2-n%2

rival = 3-player

if s >= 29:

return rival

if n > lim:

return 0

pos=[(s+1,0),(s+2,1),(s*2,2)]

if len(t) >= 2:

del pos[t[-2]]

res = [move(n+1,lim,p[0],t+[p[1]]) for p in pos]

if any([r==player for r in res]):

return player

if all([r==rival for r in res]):

return rival

return 0

 

print('#19:',*[s for s in range(1,29) if move(1,1,s,[])==0 and move(1,3,s,[])==1])

print('#20:',*[s for s in range(1,29) if move(1,2,s,[])==0 and move(1,4,s,[])==2])

print('#21:',*[s for s in range(1,29) if move(1,3,s,[])==0 and move(1,5,s,[])==1])


Аналоги к заданию № 40737: 40996 46977 47018 Все

1
Тип 19 № 47016
i

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

На­при­мер, если в на­ча­ле игры в куче 3 камня, Петя может пер­вым ходом по­лу­чить кучу из 4, 5 или 6 кам­ней. Если Петя по­лу­чил кучу из 5 кам­ней (до­ба­вил два камня), то сле­ду­ю­щим ходом Ваня может по­лу­чить 6, 7 или 10 кам­ней. Если Ваня до­ба­вил один ка­мень и по­лу­чил 6 кам­ней, то вто­рым ходом Петя может по­лу­чить 7 или 12 кам­ней. По­лу­чить 8 кам­ней Петя не может, так как для этого нужно до­ба­вить 2 камня, а Петя делал это на преды­ду­щем ходу.

Чтобы де­лать ходы, у каж­до­го иг­ро­ка есть не­огра­ни­чен­ное ко­ли­че­ство кам­ней.

Игра за­вер­ша­ет­ся, когда ко­ли­че­ство кам­ней в куче ста­но­вит­ся не менее 29. По­бе­ди­те­лем счи­та­ет­ся игрок, сде­лав­ший по­след­ний ход, то есть пер­вым по­лу­чив­ший кучу, в ко­то­рой будет 29 или боль­ше кам­ней. В на­чаль­ный мо­мент в куче было S кам­ней, 1 ⩽ S ⩽ 28.

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

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


Аналоги к заданию № 40735: 40994 47016 Все


2
Тип 20 № 47017
i

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

На­при­мер, если в на­ча­ле игры в куче 3 камня, Петя может пер­вым ходом по­лу­чить кучу из 4, 5 или 6 кам­ней. Если Петя по­лу­чил кучу из 5 кам­ней (до­ба­вил два камня), то сле­ду­ю­щим ходом Ваня может по­лу­чить 6, 7 или 10 кам­ней. Если Ваня до­ба­вил один ка­мень и по­лу­чил 6 кам­ней, то вто­рым ходом Петя может по­лу­чить 7 или 12 кам­ней. По­лу­чить 8 кам­ней Петя не может, так как для этого нужно до­ба­вить 2 камня, а Петя делал это на преды­ду­щем ходу.

Чтобы де­лать ходы, у каж­до­го иг­ро­ка есть не­огра­ни­чен­ное ко­ли­че­ство кам­ней.

Игра за­вер­ша­ет­ся, когда ко­ли­че­ство кам­ней в куче ста­но­вит­ся не менее 29. По­бе­ди­те­лем счи­та­ет­ся игрок, сде­лав­ший по­след­ний ход, то есть пер­вым по­лу­чив­ший кучу, в ко­то­рой будет 29 или боль­ше кам­ней. В на­чаль­ный мо­мент в куче было S кам­ней, 1 ⩽ S ⩽ 28.

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

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

В от­ве­те за­пи­ши­те най­ден­ные зна­че­ния в по­ряд­ке воз­рас­та­ния: сна­ча­ла мень­шее, затем боль­шее.


Аналоги к заданию № 40736: 40995 47017 Все