Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/120: Рейтинг темы: голосов - 120, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 11.01.2022
Сообщений: 1

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит три кучи камней

11.01.2022, 20:37. Показов 24293. Ответов 2

Студворк — интернет-сервис помощи студентам
Решая задачи 19-21 егэ впервые встретил условие с 3 кучами, которое ввело меня в ступор. Условие:
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит три кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч 3, 13 или 23 камня. Игра завершается в тот момент, когда в сумме в кучах будет не менее 73 камней. Победителем считается игрок, сделавший последний ход. В начальный момент в кучах было (2, S, 2S) камней, 1 ≤ S ≤ 23.
1)Найдите минимальное и максимальное значения S, при которых Петя выигрывает вторым ходом при любом ходе Вани.
2)Найдите два значения S, при которых выигрышная стратегия есть у Вани, но Петя может выбрать, каким ходом выиграет Ваня – первым или вторым.
Попробовав, как обычно, поменять условие, у меня ничего не вышло. Правильные ответы: 1) 8 14
2) 10 13
Надеюсь поможете разобраться, что я сделал не так
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
k1,k2,k3 = 3,13,23
n,t=2,73
def gameover(n1,n2,n3):
    return n1+n2+n3>=t
def win(n1,n2,n3,bymove):
    if gameover(n1,n2,n3):
        return False
    return lose(n1+k1,n2,n3,bymove-1) or\
           lose(n1+k2,n2,n3,bymove-1) or\
           lose(n1+k3,n2,n3,bymove-1) or\
           lose(n1,n2+k1,n3,bymove-1) or\
           lose(n1,n2+k2,n3,bymove-1) or\
           lose(n1,n2+k3,n3,bymove-1) or\
           lose(n1,n2,n3+k1,bymove-1) or\
           lose(n1,n2,n3+k2,bymove-1) or\
           lose(n1,n2,n3+k3,bymove-1)
def lose(n1,n2,n3,bymove):
    if gameover:
        return True
    if bymove == 0:
        return False
    return win(n1+k1,n2,n3,bymove) and\
           win(n1+k2,n2,n3,bymove) and\
           win(n1+k3,n2,n3,bymove) and\
           win(n1,n2+k1,n3,bymove) and\
           win(n1,n2+k2,n3,bymove) and\
           win(n1,n2+k3,n3,bymove) and\
           win(n1,n2,n3+k1,bymove) and\
           win(n1,n2,n3+k2,bymove) and\
           win(n1,n2,n3+k3,bymove)
ans2,ans3=[],[]
for s in range(1,24):
    if win(n,s,2*s,2) :
        ans2.append(s)
    if lose(n,s,2*s,2) or lose(n,s,2*s,1):
        ans3.append(s)
print(ans2,ans3)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.01.2022, 20:37
Ответы с готовыми решениями:

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

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

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

2
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
14.01.2022, 12:58
«2) Найдите два значения S, при которых выигрышная стратегия есть у Вани, но Петя может выбрать, каким ходом выиграет Ваня – первым или вторым.»

Это задание сформулировано некорректно. На самом деле выигрышная стратегия у Вани есть только при S = 7 (гарантированно выигрывает на своем втором ходу при любых ходах Пети) и при S = 15 (гарантированно выигрывает на своем первом ходу при любых ходах Пети). При всех остальных значениях S выигрышная стратегия есть только у Пети. Поэтому здесь он может только намеренно проиграть. А намеренно проиграть, имея возможность выбрать, сделать это на первом или на втором ходу Вани, он может при значениях S от 9 до 20.

Мое решение:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
n_finish = 73
S_min = 1
S_max = 23
move_vals = [3, 13, 23]
move_val_min = move_vals[0] # 3
move_val_max = move_vals[-1] # 23
move_val_min_max = move_val_min + move_val_max # 26
#==============================================================================
def Petya_purposely_loses_on_move( k, S ):
    n = S*3 + 2
    rem = n_finish - n
    return move_val_min * (k-1) < rem <= move_val_max * k
#==============================================================================
def Petya_purposely_loses_on_second_and_fourth_move(S):
    return Petya_purposely_loses_on_move(2, S) \
           and Petya_purposely_loses_on_move(4, S)
#==============================================================================
def Petya_is_guaranteed_win_on_second_move(S):
    n = S*3 + 2
    rem = n_finish - n
    rem -= move_val_min_max
    return 0 < rem <= move_val_max
#==============================================================================
S_values = [ x for x in range( S_min, S_max + 1 ) ]
S_P_g_win = list(filter(Petya_is_guaranteed_win_on_second_move, S_values))
print( 'Значения S, при которых Петя выигрывает вторым ходом при любом ходе Вани:' )
print(S_P_g_win)
print()
S_P_loses_2_4 = list(filter(Petya_purposely_loses_on_second_and_fourth_move, S_values))
print( 'Значения S, при которых Петя может намеренно проиграть Ване, при этом выбрав,' )
print( 'сделать это на втором или четвертом ходу:' )
print( S_P_loses_2_4 )
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
14.01.2022, 23:44
Пардон, в предыдущее сообщение вкрались ошибки. Петя может намеренно проиграть Ване на втором или четвертом ходу игры или, соответственно, на первом или втором ходу Вани при значениях S от 9 до 13.
Вот исправленный код программы:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
n_finish = 73
S_min = 1
S_max = 23
move_vals = [3, 13, 23]
move_val_min = move_vals[0] # 3
move_val_max = move_vals[-1] # 23
move_val_min_max = move_val_min + move_val_max # 26
#==============================================================================
def Petya_purposely_loses_on_2_move(S):
    n = S*3 + 2
    rem = n_finish - n
    return move_val_min + 1  <= rem <= move_val_max * 2
#==============================================================================
def Petya_purposely_loses_on_4_move(S):
    n = S*3 + 2
    rem = n_finish - n
    return move_val_max + move_val_min*2 + 1  <= rem <= move_val_max * 4
#==============================================================================
def Petya_purposely_loses_on_2_and_4_move(S):
    return Petya_purposely_loses_on_2_move(S) \
           and Petya_purposely_loses_on_4_move(S)
#==============================================================================
def Petya_is_guaranteed_win_on_second_move(S):
    n = S*3 + 2
    rem = n_finish - n
    rem -= move_val_min_max
    return 0 < rem <= move_val_max
#==============================================================================
S_values = [ x for x in range( S_min, S_max + 1 ) ]
S_P_g_win = list(filter(Petya_is_guaranteed_win_on_second_move, S_values))
print( 'Значения S, при которых Петя выигрывает вторым ходом при любом ходе Вани:' )
print(S_P_g_win)
print()
S_P_loses_2_4 = list(filter(Petya_purposely_loses_on_2_and_4_move, S_values))
print( 'Значения S, при которых Петя может намеренно проиграть Ване, при этом выбрав,' )
print( 'сделать это на втором или четвертом ходу:' )
print( S_P_loses_2_4 )
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.01.2022, 23:44
Помогаю со студенческими работами здесь

Стратегия при игре "Куча камней"
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За...

Два игрока, Петя и Ваня, играют в следующую игру
(№ 4825) Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает...

Есть кучка из n камней. Два игрока играют в игру. Первый игрок на своем ходу может взять либо a1, либо a2, ., либо ak
Есть кучка из n камней. Два игрока играют в игру. Первый игрок на своем ходу может взять либо a1, либо a2, ..., либо ak камней. Второй...

Игроки А и В играют в следующую игру
Помогите пожалуйста, никак не могу решать. Игроки А и В играют в следующую игру. Игрок А делает ставку 10 грн, а игрок В - 7 грн. Из...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru