Задания 19–21
Выигрышная стратегия
Игра двух игроков: свой ход и ход соперника, позиции В1, П1, В2, П2 от конца игры, программа на Python, две кучи и уменьшение кучи.
6 подтем · 27 задач + 7 дополнительных · базовый / повышенный / высокий · ≈ 22 мин
Подтема 1 из 6
Игра и вопросы 19–21
Что спрашивают в заданиях 19–21: ход и конец игры, партия и стратегия, свой ход и ход соперника, неудачный ход Пети.
Как устроена тема
В заданиях 19, 20 и 21 одна игра и три вопроса о ней. Два игрока по очереди меняют кучи камней, и нужно понять, при каком начальном числе камней кто-то из них может выиграть наверняка. Вот задача, которую мы решим в этой теме:
«Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч (по своему выбору) три камня или увеличить количество камней в куче в два раза. Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней. Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 100. Победителем считается игрок, сделавший последний ход, т. е. первым получивший позицию, в которой в кучах всего 100 камней или больше. В начальный момент в первой куче было 7 камней, во второй куче — S камней; 1 ≤ S ≤ 92. Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.
Задание 19. Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение S, когда такая ситуация возможна.
Задание 20. Найдите два наименьших значения S, при которых у Пети есть выигрышная стратегия, причём одновременно выполняются два условия: Петя не может выиграть за один ход; Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.
Задание 21. Найдите минимальное значение S, при котором одновременно выполняются два условия: у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети; у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.»
Главное здесь — не числа, а логика: где хватает одного удачного хода, а где нужно выдержать любой ход соперника. Разберём условие:
| В условии | Что это значит |
|---|---|
| первый ход делает Петя | Петя ходит первым, третьим, пятым ходом игры, Ваня — вторым и четвёртым |
| добавить в одну из куч три камня или увеличить количество камней в куче в два раза | за ход меняется одна куча, игрок сам выбирает какая и как: из (7, S) — четыре разных хода |
| суммарное количество камней не менее 100 | игра кончается, как только в двух кучах вместе 100 камней или больше |
| победителем считается игрок, сделавший последний ход | выигрывает тот, кто первым дошёл до 100 |
| может выиграть при любых ходах противника | выигрышная стратегия — гарантия: годятся все ответы соперника |
| после неудачного первого хода Пети (задание 19) | не гарантия, а возможность: Петя ошибся, Ваня этим воспользовался |
| Петя не может выиграть за один ход (задание 20) | каким бы ни был первый ход Пети, игра на нём не кончается |
| нет стратегии, которая позволит гарантированно выиграть первым ходом (задание 21) | сразу Ваня может и выиграть, но не при любой игре Пети |
Две кучи и порог 100 — это сотни позиций, руками их не разобрать. Поэтому учиться будем на маленькой игре с одной кучей, а потом то же рассуждение запишем программой. Тема состоит из пяти подтем и дополнительного урока — у каждой своя страница. Идём по ним по порядку:
- Игра и вопросы 19–21 — ты сейчас здесь: ход, стратегия и вопрос о неудачном ходе.
- Позиции от конца игры — группы В1, П1, В2, П2 и какой вопрос о какой группе.
- Программа — то же рассуждение одной функцией на Python.
- Две кучи — решим задачу темы: ответы 24, 23 42 и 39.
- Уменьшение кучи и ходы с условием — деление с округлением, ходы «если чётное», наибольшее S.
- Третий ход и позиция шире числа — дополнительный урок для редких задач.
Ход и позиция
Что происходит в игре за один ход?
Ход — одно действие одного игрока: из одного числа камней получается другое. Учебная игра, на которой разберём всю логику темы:
- в куче S камней, 1 ≤ S ≤ 20;
- первым ходит Петя, потом Ваня, потом снова Петя и так далее;
- за ход можно добавить один камень или удвоить кучу;
- игра кончается, когда в куче не менее 21 камня, — выиграл тот, кто это сделал.
Из 7 камней можно получить 7 + 1 = 8 или 7 · 2 = 14 — что-то одно. Число камней перед ходом называют позицией: «в куче 10, ходит Ваня».
В заданиях ходы считают у каждого игрока свои: «Петя выиграл своим вторым ходом». Петя ходит первым, поэтому его второй ход — третий ход всей игры:
| Ход игры | Кто ходит | Его ход по счёту |
|---|---|---|
| 1 | Петя | первый |
| 2 | Ваня | первый |
| 3 | Петя | второй |
| 4 | Ваня | второй |
«Петя выигрывает вторым ходом» — это три хода игры: Петя, Ваня, Петя. Проверить только два — частая ошибка.
Конец игры
Когда игра заканчивается?
Порог проверяют после каждого хода: кто первым до него дошёл, тот выиграл, и дальше никто не ходит. Если Петя из 12 получил 24, он уже выиграл — Ваня после этого не ходит.
«Не менее 21» — это s ≥ 21: подходят и 21, и 22, и 40, ровно 21 получать не нужно. Одно слово в условии меняет сравнение, а с ним и все три ответа:
- не менее 21
s >= 2121 подходит- более 21
s > 21нужно хотя бы 22- не более 21
s <= 21в играх, где кучу уменьшают- менее 21
s < 2121 уже не подходит
Партия и стратегия
S = 6. Петя удвоил — 12, Ваня удвоил — 24 и выиграл. Значит, при S = 6 Ваня всегда выигрывает первым ходом?
Нет. Это одна партия — одна сыгранная игра. Она показывает, что Ваня может выиграть, но не что он выиграет всегда: для этого нужно проверить все ходы Пети. Петя мог сходить и 6 → 7, а из 7 Ваня получит 8 или 14 — игра не кончится:
Выигрышная стратегия — план игрока, который приводит к победе при любых ходах соперника. Возьмём S = 5. Петя удваивает кучу и отдаёт Ване 10. Ваня может получить 11 или 20 — и из обеих позиций Петя выигрывает следующим ходом:
Такой рисунок называют деревом игры. В дереве стратегии у Пети нарисован один выбранный ход, а у Вани — все. Последний ход Пети зависит от ответа Вани: «если 11 — удвоить, если 20 — добавить один». Это нормальная стратегия.
Свой ход и ход соперника
Как проверить, что стратегия выигрышная?
На своём ходе хватает одного удачного хода, а на ходе соперника удачными должны быть все его ходы. Свой ход игрок выбирает сам — ему нужен хотя бы один хороший. А ход соперника выбирает соперник, и он выберет самый неудобный для нас, поэтому проверять приходится каждый. Проверим стратегию Пети при S = 5:
- Ход Пети: 5 → 6 или 5 → 10. Ход 5 → 6 неудачный, но это неважно: Петя выберет 5 → 10.
- Ход Вани: 10 → 11 или 10 → 20. Оба ответа нужно проверить: если бы хоть один спасал Ваню, гарантии бы не было.
- Ход Пети: из 11 есть 22, из 20 есть 21. На каждый ответ Вани нашёлся победный ход.
«Свой» — это ход того, чью победу проверяем. Когда проверяем стратегию Вани, всё наоборот: на ходе Вани хватает одного хода, а на ходе Пети нужны все. Поэтому правило не привязано к именам — только к тому, о чьей победе вопрос.
Порядок тоже важен: Петя выбирает первый ход заранее и не может поменять его, узнав ответ Вани.
Неудачный ход Пети
Что значит «Ваня выиграл своим первым ходом после неудачного первого хода Пети»?
Это не гарантия, а возможность: нужен хотя бы один плохой ход Пети и хотя бы один победный ответ Вани. Так часто звучит задание 19. Неважно, что Петя мог сыграть лучше: нам нужно, чтобы такая партия была возможна.
При S = 6 она есть: Петя удваивает — 12, и Ваня удваивает — 24. Это партия, выделенная на первом дереве. А при S = 5 — уже нет: даже два удвоения подряд дают 5 · 2 · 2 = 20, до 21 не хватает. Поэтому наименьшее S для этого вопроса — 6.
Здесь за два хода игры — Петин и Ванин — куча должна дойти от S до порога. Быстрее всего она растёт, если оба раза сделать самый сильный ход. Отсюда правило: наименьшее S — то, при котором два самых сильных хода подряд дотягивают до порога.
Тонкости:какие ходы самые сильные
Если ходов больше двух, сравни пары. При ходах +7 и ×2 из маленькой кучи прибавление даёт больше удвоения, поэтому проверяют и «×2, ×2», и «+7, ×2», и «×2, +7».
Неудачный ход Пети не запрещает ему выиграть сразу: игрок может и выиграть, и ошибиться. Если в условии отдельно сказано «Петя не может выиграть первым ходом», это нужно проверить отдельно.
Итого
- Хододно действие одного игрока
- Конец игрыпосле каждого хода, сравнение — точно по условию
- Второй ход Петитретий ход игры; второй ход Вани — четвёртый
- Партияодин вариант игры — показывает возможность
- Стратегияпобеда при любых ходах соперника — гарантия
- Свой ходхватает одного удачного
- Ход соперникаудачными должны быть все
- Неудачный ход Петивозможность: наименьшее S — два сильнейших хода подряд
Проверьте себя
Ответь сначала сам, потом открой ответ.
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
+1 или ×3, неудачный ход Пети
Игра: +1 или ×3, победа при s ≥ 40. Найди наименьшее S, при котором Ваня может выиграть первым ходом после неудачного первого хода Пети.
Введите число.
Подсказка
Неудачный ход — возможность: проверь два самых сильных хода подряд.
Решение
5: два утроения дают 5 · 3 · 3 = 45 ≥ 40, а из 4 — только 36. Партия 5 → 15 → 45.
from functools import cache def moves(s): return [s + 1, s * 3] def finished(s): return s >= 40 @cachedef g(s): nxt = moves(s) if any(finished(q) for q in nxt): return 1 # В1 r = [g(q) for q in nxt] if all(x == 1 for x in r): return -1 # П1 if -1 in r: return 2 # В2 if all(x > 0 for x in r): return -2 # П2 return 0 def mistake(s): # Петя ходит так, что Ваня выигрывает сразу return any(not finished(q) and g(q) == 1 for q in moves(s)) print(min(s for s in range(1, 40) if mistake(s)))Ответ: 5
+7 или ×2, неудачный ход Пети
Игра: +7 или ×2, победа при s ≥ 40. Найди наименьшее S, при котором Ваня может выиграть первым ходом после неудачного первого хода Пети. Проверь не только два удвоения.
Введите число.
Подсказка
Из маленькой кучи прибавление 7 сильнее удвоения: сравни все пары ходов.
Решение
10: 10 · 2 · 2 = 40. Из 9 два удвоения дают 36, прибавление и удвоение — (9 + 7) · 2 = 32 и 9 · 2 + 7 = 25, два прибавления — 23.
from functools import cache def moves(s): return [s + 7, s * 2] def finished(s): return s >= 40 @cachedef g(s): nxt = moves(s) if any(finished(q) for q in nxt): return 1 # В1 r = [g(q) for q in nxt] if all(x == 1 for x in r): return -1 # П1 if -1 in r: return 2 # В2 if all(x > 0 for x in r): return -2 # П2 return 0 def mistake(s): # Петя ходит так, что Ваня выигрывает сразу return any(not finished(q) and g(q) == 1 for q in moves(s)) print(min(s for s in range(1, 40) if mistake(s)))Ответ: 10
+1, +4 или ×4
Два игрока, Петя и Ваня, играют в игру с кучей камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень, добавить четыре камня или увеличить количество камней в куче в четыре раза. Игра завершается, когда количество камней в куче становится не менее 90. Победителем считается игрок, сделавший последний ход. В начальный момент в куче было S камней, 1 ≤ S ≤ 89. Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение S, когда такая ситуация возможна.
Введите число.
Подсказка
Самый быстрый рост — два умножения на 4 подряд.
Решение
6: два умножения на 4 дают 6 · 4 · 4 = 96 ≥ 90, а 5 · 4 · 4 = 80; с прибавлениями меньше: (5 + 4) · 4 = 36.
from functools import cache def moves(s): return [s + 1, s + 4, s * 4] def finished(s): return s >= 90 @cachedef g(s): nxt = moves(s) if any(finished(q) for q in nxt): return 1 # В1 r = [g(q) for q in nxt] if all(x == 1 for x in r): return -1 # П1 if -1 in r: return 2 # В2 if all(x > 0 for x in r): return -2 # П2 return 0 def mistake(s): # Петя ходит так, что Ваня выигрывает сразу return any(not finished(q) and g(q) == 1 for q in moves(s)) print(min(s for s in range(1, 90) if mistake(s)))Ответ: 6