Решение задач 19 21 егэ по информатике с помощью python

Продолжаем наш видеокурс по подготовке к ЕГЭ по информатике 2023!

Сегодня разберём задачи из 19, 20 и 21 задания ЕГЭ по информатике. Для этих задач существует спасительный шаблон на Python, который позволяет получить на них правильные ответы и затратить минимум сил и времени.

Приступим к первой серии задач из демоверсии ЕГЭ по информатике 2021 года.

Задание 19 (Демо 2021)

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат
две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один
ход игрок может добавить в одну из куч (по своему выбору) один камень
или увеличить количество камней в куче в два раза. Например, пусть
в одной куче 10 камней, а в другой 5 камней; такую позицию в игре будем
обозначать (10, 5). Тогда за один ход можно получить любую из четырёх
позиций: (11, 5), (20, 5), (10, 6), (10, 10). Для того чтобы делать ходы,
у каждого игрока есть неограниченное количество камней.

Игра завершается в тот момент, когда суммарное количество камней в кучах
становится не менее 77. Победителем считается игрок, сделавший
последний ход, т.е. первым получивший такую позицию, при которой
в кучах будет 77 или больше камней.

В начальный момент в первой куче было семь камней, во второй куче –
S камней; 1 ≤ S ≤ 69.

Будем говорить, что игрок имеет выигрышную стратегию, если он может
выиграть при любых ходах противника. Описать стратегию игрока – значит
описать, какой ход он должен сделать в любой ситуации, которая ему может
встретиться при различной игре противника. В описание выигрышной
стратегии не следует включать ходы играющего по этой стратегии игрока,
не являющиеся для него безусловно выигрышными, т.е. не являющиеся
выигрышными независимо от игры противника.

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

Решение:

Решим задачу с помощью шаблона на языке программирования Python. Если хотите ознакомится с аналитическим решением задач на теорию игр, можете посмотреть мои статьи по 19 Заданию, 20 Заданию, 21 Заданию. Но с помощью шаблонов на экзамене решать быстрее и легче.

Введём параметр p, который будет олицетворять позицию игры (ход).

Начальная позиция Ход Пети Ход Вани Ход Пети Ход Вани Ход Пети
p 1 2 3 4 5 6
def F(x, y, p):
    if x + y >= 77 and p==3: return True
    if x + y < 77 and p==3: return False

    return F(x+1, y, p+1) or F(x*2, y, p+1) or F(x, y+1, p+1) or F(x, y*2, p+1)
  

for s in range(1, 70):
    if F(s, 7, 1):
        print(s)

Заводим функцию F. Она принимает параметры: x — количество камней в одной куче, y — в другой, p-позиция игры.

Дальше описываем победу. Если x+y>=77 и позиция равна 3 (1 Ход Вани), то возвращаем True, что означает победу.

Если, позиция уже равна 3, но сумарное количество камней меньше, чем должно быть для победы, то возвращаем False (проигрыш).

Если мы не вышли на первых двух условиях, то, значит, продолжаем прокручивать ходы, рекурсивно запускаем функцию F.

Т.к. здесь формулировка: «Известно, что Ваня выиграл своим первым ходом после неудачного первого
хода Пети.», то между функциями ставим союз ИЛИ (or).

В конце перебираем все возможные значения для s через цикл for, ищём те значения, которые подходят по условию задачи. Значение p всегда увеличиваем на 1.

Ответ: 18

Задание 20 (Демо 2021)

Для игры, описанной в предыдущем задании, найдите два таких значения S,
при которых у Пети есть выигрышная стратегия, причём одновременно
выполняются два условия:

− Петя не может выиграть за один ход;

− Петя может выиграть своим вторым ходом независимо от того, как
будет ходить Ваня.

Найденные значения запишите в ответе в порядке возрастания.

Решение:

Легко переделать из прошлой задачи.

def F(x, y, p):
    if x + y >= 77 and p==4: return True
    if x + y < 77 and p==4: return False
    if x + y >= 77: return False

    if p%2==0:
        return F(x+1, y, p+1) and F(x*2, y, p+1) and F(x, y+1, p+1) and F(x, y*2, p+1)
    else:
        return F(x+1, y, p+1) or F(x*2, y, p+1) or F(x, y+1, p+1) or F(x, y*2, p+1)
  

for s in range(1, 70):
    if F(s, 7, 1):
        print(s)

Теперь должен выигрывать Петя на своём втором ходе. Поэтому в условиях ставим позицию p=4.

Добавляется третье условие. Если кто-то выиграл, но на первых двух условиях мы не вышли из функции, то, значит, выиграл не тот, кто нам нужен, следовательно, возвращаем Fasle.

Здесь вопрос отличается от 19 задания. Здесь Петя должен побеждать при любом ходе соперника, а не при одном неудачном ходе Вани, поэтому добавляется ещё условие.

Для чётных p (это ходы Пети), возвращаем разные ходы через and, т.к. он должен побеждать в любом случае.

Для нечётных p (это ходы Вани), возвращаем ходы через or.

Ответ:

Задание 21 (Демо 2021)

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

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

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

Решение:

Опять используем прошлый шаблон, но немного модернизируем.

def F(x, y, p):
    if x + y >= 77 and (p==3 or p==5): return True
    if x + y < 77 and p==5: return False
    if x + y >= 77: return False

    if p%2==1:
        return F(x+1, y, p+1) and F(x*2, y, p+1) and F(x, y+1, p+1) and  F(x, y*2, p+1)
    else:
         return F(x+1, y, p+1) or F(x*2, y, p+1) or F(x, y+1, p+1) or  F(x, y*2, p+1)


def F1(x, y, p):
    if x + y >= 77 and p==3: return True
    if x + y < 77 and p==3: return False
    if x + y >= 77: return False

    if p%2==1:
        return F1(x+1, y, p+1) and F1(x*2, y, p+1) and F1(x, y+1, p+1) and  F1(x, y*2, p+1)
    else:
         return F1(x+1, y, p+1) or F1(x*2, y, p+1) or F1(x, y+1, p+1) or  F1(x, y*2, p+1)

for s in range(1, 70):
    if F(s, 7, 1):
        print(s)

print()

for s in range(1, 70):
    if F1(s, 7, 1):
        print(s)

Здесь Ваня должен выигрывать либо на первом своём ходе (p=3), либо на втором своём ходе (p=5).

Т.к. Ваня не должен гарантированно выиграть своим первым ходом, то мы создаём ещё одну функцию F1, похожую на основную функцию F, которая вычисляет, когда Ваня именно гарантированно выигрывает на своём первом ходе (p=3). И, затем, мы из тех чисел, которые получились в первой функции F, исключаем числа, которые получились во второй функции F1.

В первой функции получилось 30,33, а во второй результатов нет. Получается ответ 30.

Ответ: 30

Следущая вариация задач отличается от первой лишь задачей в 19-ом задании. Рассмотрим демоверсию ЕГЭ по информатике 2022. Так же в этой серии задач будет одна куча, но из-за этого шаблон практически никак не меняется.

Задание 19 (Демо 2022)

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

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

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

Будем говорить, что игрок имеет выигрышную стратегию, если он может
выиграть при любых ходах противника. Описать стратегию игрока – значит
описать, какой ход он должен сделать в любой ситуации, которая ему может
встретиться при различной игре противника. В описание выигрышной
стратегии не следует включать ходы играющего по этой стратегии игрока,
не являющиеся для него безусловно выигрышными, т.е. не являющиеся
выигрышными независимо от игры противника.

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

Решение:

Здесь вопрос отличается от прошлой 19-ой задачи. Здесь Петя должен выиграть в любом случае. Мы эту задачу можем воспринимать, как 20-ую из демоверсии 2021. Ведь там тоже игроку нужно обязательно было побеждать. Осталось написать шаблон с соответствующими параметрами.

def F(x, p):
    if x>=29 and p==3: return True
    if x<29 and p==3: return False
    if x>=29: return False

    if p%2==1:
        return F(x+1, p+1) and F(x*2, p+1)
    else:
         return F(x+1, p+1) or F(x*2, p+1)

for s in range(1, 29):
    if F(s, 1):
        print(s)

Заводим функцию F. Т.к. у нас одна куча, то она принимает параметры: x — количество камней в куче, p-позиция игры.

Дальше описываем победу. Если x>=29 и позиция равна 3 (1 Ход Вани), то возвращаем True, что означает победу.

Если, позиция уже равна 3, но камней меньше, чем должно быть для победы, то возвращаем False (проигрыш).

Третье условие. Если кто-то выиграл, но на первых двух условиях мы не вышли из функции, то, значит, выиграл не тот, кто нам нужен, следовательно, возвращаем Fasle.

Если мы не вышли на первых трёх условиях, то, значит, продолжаем прокручивать ходы, рекурсивно запускаем функцию F.

Для нечётных p (это ходы Вани), возвращаем разные ходы через and, т.к. он должен побеждать в любом случае. При этом увеличиваем на 1 значение p.

Для чётных p (это ходы Пети), возвращаем ходы через or.

В конце перебираем все возможные значения для s через цикл for, ищём те значения, которые подходят по условию задачи.

Ответ: 14

Задание 20 (Демо 2022)

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

− Петя не может выиграть за один ход;

− Петя может выиграть своим вторым ходом независимо от того, как
будет ходить Ваня.

Найденные значения запишите в ответе в порядке возрастания.

Решение:

Задача точно такая же, как и в 19 задании, только теперь обязательно должен побежать Петя на своём втором ходу (p=4), при любой игре Вани.

Пишем тот же шаблон, немного отредактировав его.

def F(x, p):
    if x>=29 and p==4: return True
    if x<29 and p==4: return False
    if x>=29: return False

    if p%2==0:
        return F(x+1, p+1) and F(x*2, p+1)
    else:
         return F(x+1, p+1) or F(x*2, p+1)

for s in range(1, 29):
    if F(s, 1):
        print(s)

Получается 7 и 13.

Ответ:

Задание 21 (Демо 2022)

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

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

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

Если найдено несколько значений S, в ответе запишите минимальное из них.

Решение:

Опять используем прошлый шаблон, но немного модернизируем.

def F(x, p):
    if x>=29 and (p==3 or p==5): return True
    if x<29 and p==5: return False
    if x>=29: return False

    if p%2==1:
        return F(x+1, p+1) and F(x*2, p+1)
    else:
         return F(x+1, p+1) or F(x*2, p+1)


def F1(x, p):
    if x>=29 and p==3: return True
    if x<29 and p==3: return False
    if x>=29: return False

    if p%2==1:
        return F1(x+1, p+1) and F1(x*2, p+1)
    else:
         return F1(x+1, p+1) or F1(x*2, p+1)

for s in range(1, 29):
    if F(s, 1):
        print(s)

print()

for s in range(1, 29):
    if F1(s, 1):
        print(s)

Здесь Ваня должен выигрывать либо на первом своём ходе (p=3), либо на втором своём ходе (p=5).

Т.к. Ваня не должен гарантированно выиграть своим первым ходом, то мы создаём ещё одну функцию F1, похожую на основную функцию F, которая вычисляет, когда Ваня именно гарантированно выигрывает на своём первом ходе (p=3). И, затем, мы из тех чисел, которые получились в первой функции F, исключаем числа, которые получились во второй функции F1.

В первой функции получилось 12,14, а во второй 14. Получается ответ 12.

Ответ: 12

На сегодня всё. Мы рассмотрели самые распространённые вариации задач из 19-21 задания и подобрали к ним «противоядие». До новых встреч!

В первой 21 задаче в функции F1 только камни x сраниваются с 77. Там надо x + y как в основной функции?

Да, Вы правы, нужно x+y писать. Исправил, спасибо!

Почему начальная позиция p=1? Нельзя ли её сделать р=0?
Дабы избежать у учеников путаницы в голове по нумерации ходов. Или в этом скрывается ошибка?
Извините хотел оперативный ответ от Мастера, т.к. нет времени на эксперименты.

На мой взгляд, можно, поменяв соответствующие параметры тоже. Но не будет ли путаницы, если ваши ученики будут находить решения в интернете, где начинается p c 1.

В первом 19ом задании в функции def мне кажется, что не хватает строки if x + y >= 77: return False
Спасибо за Ваш труд!

Нет, там всё в порядке. В формулировке, когда «после неудачного первого хода Пети», можно писать два условия.

я не понимаю почему вы в первых задачах пишите в конце программы строку » if F1(s, 7, 1):»

Проверяем подходит ли значение s под условие задачи. Семёрка — это количество каменей в первой куче.

Спасибо, за последовательность объяснения. все очень понятно.

почему то в 20 задании находит только одно значение, уже несколько вариантов КИМа так, код написан правильно. В чём причина может быть?

Пришлите ссылку на задание.

Задание 21 из КИМа ЕГЭ 2023 по информатике 17 вариант(к примеру). Можно положить 1 камень или умножить количество на 2, Если больше или равно 144 в сумме двух куч, то победа.В первой куче 3 камня, во второй 1

от 1 до 140(включительно). Условия те же. Также неверные ответы получаются в 19 и 20 заданиях. Код правильный

КИМ это оффициальный сборник вариантов в виде книжки. Могу условия на почту скинуть(хотя вроде расписал всё), тут ограничение символов

Понятно, тогда посмотрю и напишу здесь, что думаю.

Решил 17 вариант (задания 19-21) из сборника 2023 года Крылова, Чуркиной по схеме из этой статьи. Ответы сошлись. Могу вам прислать решения, если вы напишите в группе в вк.

Хотите готовиться со мной к ЕГЭ?
Пишите:
ydkras@mail.ru
Немного обо мне.

В задачах 19-21 ЕГЭ по информатике требуется проанализировать некую простую игру. Однако хотя игра и проста, её анализ может оказаться достаточно хитрым делом. Поэтому приходит мысль: а нельзя ли, чтобы этот анализ выполнил компьютер? (Спойлер: Можно!)

Немного теории.

Основную идею, лежащую в основе теории игр, подобных описанным в задачах ЕГЭ, можно выразить в двух словах: игроки умные. Это означает, что если у кого-то из игроков в текущей позиции есть возможность сделать выигрышный ход, то он этот ход сделает.

Таким образом, если в текущей позиции у игрока есть хотя бы один ход, ведущий к выигрышу, то это — выигрышная позиция для данного игрока. 

Если же в ответ на любой ход текущего игрока его противник выигрывает, то для текущего игрока такая ситуация — проигрышная.

Теперь более-менее понятно, как должна выглядеть программа, анализирующая ход игры. Прежде всего она должна проверить, не выиграл ли уже кто-то из игроков. Если это так — то дальнейший анализ позиции не требуется. 

Затем нужно просмотреть все возможные ходы текущего игрока. Если них есть хоть один выигрышный для него — в данной позиции он выиграл. Если же при любом его ходе выигрывает его противник — то можно считать, что данный игрок уже проиграл.

Если же неверно ни первое, ни второе — то ситуация неопределенная.(Вообще-то для игр из задач ЕГЭ всегда можно сказать, кто из игроков выиграет, такая неопределенность возникает только из-за ограничения на число ходов.)

Данную процедуру следует рекурсивно применять к позициям, возникающим по ходу игры.

А теперь — практика.

Решим программно задачи 19-21 из 8 варианта с сайта Полякова. Условие выглядит следующим образом:

(№ 3084) (А. Кабанов) Два игрока, Петя и Ваня, играют в следующую игру.
Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход
делает Петя. За один ход игрок может
  а) добавить в кучу один камень;
  б) увеличить количество камней в куче в два раза;
  в) увеличить количество камней в куче в три раза.
Игра
завершается в тот момент, когда количество камней в куче становится не
менее 43. Если при этом в куче оказалось не более 72 камней, то
победителем считается игрок, сделавший последний ход. В противном случае
победителем становится его противник. В начальный момент в куче было S
камней, 1≤S≤42.
Ответьте на следующие вопросы:
  Вопрос 1. Найдите минимальное значение S, при котором Ваня выигрывает своим первым ходом при любой игре Пети.
  Вопрос 2. Сколько существует значений S, при которых у Пети есть выигрышная стратегия, причём одновременно выполняются два условия:
− Петя не может выиграть за один ход;
− Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.
  Вопрос 3. Найдите минимальное и максимальное значения S, при которых одновременно выполняются два условия:
– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Найденные значения запишите в ответе в порядке возрастания.

Приведем текст рекурсивной функции hod на языке Питон, которая по сути и решает данную задачу.

def hod(number,limit,s):
    player = (number+1)%2 + 1  # номер текущего игрока (1 или 2)
    rival = 3 — player    # Номер его противника (2 или 1)
    #Анализ позиции
    if s >= 43 and s <= 72: return rival  # текущий игрок проиграл
    if s > 72 : return player  # проиграл противник

    if number > limit: return 0  # ситуация неопределенная из-за ограничений на количество ходов

        # Делаем ходы и проверяем результаты
    rc1 = hod(number+1,limit,3*s)
    if rc1 == player: return player

        rc2 = hod(number+1,limit,2*s)
    if rc2 == player: return player

    rc3 = hod(number+1,limit,s+1)
    if rc3 == player: return player

        if rc1 == rival and rc2 == rival and rc3 == rival: return rival

        return 0 

Функция имеет три параметра: number (номер хода), limit (ограничение на количество ходов) и s (количество камней в куче). При первом обращении следует задавать значение number,  равное 1 (т.е. ходы мы нумеруем с единицы).

Переменная player принимает значение 1 для нечетных номеров ходов (т.е. ходы 1, 3 и т.д. совершает первый игрок) и значение 2 — для четных номеров. Переменная rival, наоборот, равна 2 для нечетных номеров ходов и 1 — для четных. Таким образом, player — это номер игрока, который делает текущий ход, а rival — номер его противника.

Прежде всего функция проверяет, не завершилась ли игра. Если число камней S не менее 43 и не более 72, то это означает, что текущий игрок проиграл: перед этим его противник сделал победный ход. Функция завершается, вернув значение rival. Если же число камней более 72, то соперник текущего игрока только что сделал проигрышный для себя ход, и выиграл текущий игрок. Программа возвращает значение player. 

Далее проверяется ограничение на число ходов. Если это ограничение превышено (number>limit), то дальнейшие ходы не выполняются и программа возвращает значение 0 (т.е. победитель не определён).

Далее осуществляются рекурсивные вызовы функции  hod с параметром number+1 (т.е. номер хода увеличен на единицу), с тем же самым значением limit и числом камней в куче 3S, 2S и S+1 (согласно условиям задачи).

Рекомендую сначала проверять значения, как можно сильнее отличающиеся от исходного (т.е. 3S и 2S) и потом S+1. Это позволяет уменьшить число вершин «дерева игры», которые анализирует программа. С этой же целью программа, обнаружив выигрышный для текущего игрока ход (т.е. результат вызова функции равен player), немедленно возвращает значение player и не выполняет дальнейших проверок ходов.

Если все три результата ходов равны rival, то в данной позиции все ходы текущего игрока приводят к его проигрышу, и программа возвращает значение rival. 

Если же для текущего игрока нет ни одного выигрышного хода, но у него есть ходы, не приводящие к его проигрышу, то ситуация неопределённая, и программа возвращает 0.

Теперь проведем анализ данной игры и получим ответы на заданные в задаче вопросы.

Первый вопрос: каково минимальное значение S, при котором второй игрок выигрывает своим первым ходом? Для ответа на него достаточно вызвать функцию для всех значений S таких, что 1<=S<=42, с ограничением на количество ходов, равным 2 (т.е. игроки делают по одному ходу). Если функция hod вернет значение, равное 2, то при данном начальном значении S второй игрок выигрывает в любом случае.

Второй вопрос: сколько имеется значений S, при которых первый игрок не может выиграть своим первым ходом, но гарантированно выигрывает вторым?

Для этого надо запустить программу два раза, первый раз с ограничением на число ходов 1, а второй раз — с ограничением 3. Если в первом случае программа вернет значение 0 (нет победителя), а второй — 1, то при данном S первый игрок не может гарантированно выиграть своим первым ходом, но непременно выигрывает вторым. Вместо ограничений 1 и 3 можно взять 2 и 4: дополнительный ход второго игрока (если он возможен) ничего не меняет.

Наконец, последний вопрос: при каких значениях S второй игрок не может гарантированно выиграть первым ходом, но обязательно выиграет вторым? Для этого надо опять запустить функцию дважды, с ограничением на число ходов 2 и 4. Если в первом случае функция вернет 0, а во втором — 2, то это искомое значение.   

Вот программа, которая выполняет данные проверки:

for s in range(1,43):
    h2 = hod(1,2,s)
    h4 = hod(1,4,s)
    rez = »
    if h2 == 2: rez = ‘*** 19 ***’
    if h2 == 0:
        if h4 == 1: rez = ‘*** 20 ***’
        if h4 == 2: rez = ‘*** 21 ***’
    print(s,h2, h4, rez)

Результат выполнения программы следующий (из него исключены строки, которые не дают ответов не поставленные вопросы):

7 0 1 *** 20 ***
12 0 2 *** 21 ***
13 0 1 *** 20 ***
14 2 2 *** 19 ***
39 0 2 *** 21 ***
40 0 1 *** 20 ***
41 2 2 *** 19 ***

Следовательно, ответы на вопросы задачи таковы:

Вопрос 1: такие значения — 14 и 41, минимальное — 14.

Вопрос 2: такие значения — 7, 13 и 40, всего их 3.

Вопрос 3: такие значения — 12 и 39. Минимальное — 12, а максимальное — 39.

А теперь решим задачи 19-21 из демонстрационного варианта ФИПИ 2022 г.

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

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

20. Для игры, описанной в задании 19, найдите два таких значения S, при которых у Пети есть выигрышная стратегия, причём одновременно выполняются два условия:
− Петя не может выиграть за один ход;
− Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.
Найденные значения запишите в ответе в порядке возрастания.

21. Для игры, описанной в задании 19, найдите значение S, при котором одновременно выполняются два условия:
− у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
− у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Если найдено несколько значений S, в ответе запишите минимальное из них.

Вопросы по сути те же, что и в задаче с сайта Полякова, однако правила игры другие. 

Перепишем функцию hod для данных правил:

def hod(number,limit,s):
    player = (number+1)%2 + 1  # номер текущего игрока (1 или 2)
    rival = 3 — player    # Номер его противника (2 или 1)
    #Анализ позиции
    if s >= 29: return rival  # текущий игрок проиграл

    if number > limit: return 0  # ситуация неопределенная из-за ограничений на количество ходов

        # Делаем ходы и проверяем результаты
    rc1 = hod(number+1,limit,2*s)
    if rc1 == player: return player

        rc2 = hod(number+1,limit,s+1)
    if rc2 == player: return player

    if rc1 == rival and rc2 == rival: return rival

        return 0 

Основная программа выглядит так же, как и в предыдущем случае. Единственное изменение — вместо range(1,43) в ней записано range(1,29).

Результат выполнения программы следующий (в нём опять-таки опущены несущественные строки):

7 0 1 *** 20 ***
12 0 2 *** 21 ***
13 0 1 *** 20 ***
14 2 2 *** 19 ***

Отсюда видно, что ответ на задачу 19 — 14, на задачу 20 —  7 и 13, а на задачу 21 — 12. Это совпадает с приведенными в варианте ответами.

Если Петя глуповат…

При составлении программы мы предполагали, что игроки — умные и ошибочных ходов не делают. Но на сайте «Решу ЕГЭ» очень часто встречаются задачи, где один из игроков дает маху. Вот пример задачи 19 (задача 27416):

Два
игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две
кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один
ход игрок может добавить в одну из куч (по своему выбору) один камень или увеличить количество камней в куче в два раза.
Например, пусть в одной куче 10 камней, а в другой 5 камней; такую
позицию в игре будем обозначать (10, 5). Тогда за один ход можно
получить любую из четырёх позиций: (11, 5), (20, 5), (10, 6), (10, 10).
Для того чтобы делать ходы, у каждого игрока есть неограниченное
количество камней.

Игра завершается в тот
момент, когда суммарное количество камней в кучах становится не менее
77. Победителем считается игрок, сделавший последний ход, т. е. первым
получивший такую позицию, при которой в кучах будет 77 или больше
камней.

В начальный момент в первой куче было семь камней, во второй куче — S камней; 1 ≤ S ≤ 69.

Будем
говорить, что игрок имеет выигрышную стратегию, если он может выиграть
при любых ходах противника. Описать стратегию игрока — значит, описать,
какой ход он должен сделать в любой ситуации, которая ему может
встретиться при различной игре противника. В описание выигрышной
стратегии не следует включать ходы играющего по этой стратегии игрока,
не являющиеся для него безусловно выигрышными, т. е. не являющиеся
выигрышными независимо от игры противника.

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

Сначала напишем нашу функцию hod для данной задачи: она всё равно потребуется для задач 20 и 21. Впрочем, отличий от первого варианта не так много. Во-первых, так как у нас теперь две кучи, у функции есть два параметра s1 и s2: число камней в первой и второй кучах. Условие завершения игры теперь выглядит так: s1+s2>=77. Так как теперь у каждого игрока есть четыре возможных хода, то проверяется не три, а четыре альтернативы.

def hod(number,limit,s1,s2):
    player = (number+1)%2 + 1  # номер текущего игрока (1 или 2)
    rival = 3 — player    # Номер его противника (2 или 1)
    #Анализ позиции
    if s1+s2 >= 77: return rival  # текущий игрок проиграл

        if number > limit: return 0  # ситуация неопределенная из-за ограничений на количество ходов

        # Делаем ходы и проверяем результаты
    rc1 = hod(number+1,limit,2*s1,s2)
    if rc1 == player: return player

        rc2 = hod(number+1,limit,s1,2*s2)
    if rc2 == player: return player

    rc3 = hod(number+1,limit,s1+1,s2)
    if rc3 == player: return player

        rc4 = hod(number+1,limit,s1,s2+1)
    if rc4 == player: return player

        if rc1 == rival and rc2 == rival and rc3 == rival and rc4 == rival: return rival

        return 0

Но как быть с тем, что наша функция предполагает безошибочную игру, а условие задачи подразумевает, что первый игрок сделал ошибочный ход? А очень просто: надо вызвать функцию четыре раза с позициями, которые могут получиться после первого хода Пети. В параметрах функции надо указать, что это — второй ход, и задать ограничение на количество ходов, равное двум. Если хотя бы в одном случае функция даст ответ, что выиграл второй игрок, то это и будет ответом на вопрос задачи.

Таким образом, основная программа выглядит так:

s1=7
for s2 in range(1,70):
    if hod(2,2,s1*2,s2)==2 or hod(2,2,s1,s2*2)==2 or hod(2,2,s1+1,s2)==2 or hod(2,2,s1,s2+1)==2:
        print(s2)
        break

Она дает правильный ответ: 18 камней.

Когда основная функция написана, не представляет сложности решить задачи 20 и 21. Вот их вопросы (правила игры, естественно, те же самые):

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

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

Основная программа опять-таки похожа на первый вариант, отличия незначительные:

s1=7
for s2 in range(1,70):
    h2 = hod(1,2,s1,s2)
    h4 = hod(1,4,s1,s2)
    rez = »
    if h2 == 0:
        if h4 == 1: rez = ‘*** 20 ***’
        if h4 == 2: rez = ‘*** 21 ***’
    print(s2,h2, h4, rez)

Результат работы программы (опять-таки опущены несущественные строки):

30 0 2 *** 21 ***
31 0 1 *** 20 ***
33 0 2 *** 21 ***
34 0 1 *** 20 ***

Таким образом, ответ на вопрос задачи 20 — это 31 и 34, а на вопрос задачи 21 — 30 (напомню, что там требуется минимальное значение из двух ответов: 30 и 33).

Итак, мы убедились, что задачи 19-21 ЕГЭ по информатике можно решить программно, и решение — не слишком сложное.

(c) Ю.Д.Красильников, 2021 г.

Cover image for Теория игр в 19-21 задачах КЕГЭ 2021

Введение

Привет друг! Проблемы с теорией игр? В этой статье мы разберем код, который решает любые прототипы стандартных 19-21 задач из КЕГЭ. Чтобы максимально понять ниже описанный код, я крайне рекомендую сначала научиться решать эти задачи ручками.

Условие

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч один камень или увеличить количество камней в куче в четыре раза.
В начальный момент в первой куче было 3 камня, во второй куче — S камней, 1 ≤ S ≤ 57. Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 61. Победителем считается игрок, сделавший последний ход, то есть первым получивший позицию, в которой в кучах будет 61 или больше камней.

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

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

    • Петя не может выиграть за один ход;
    • Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.
  3. Найдите минимальное значение S, при котором одновременно выполняются два условия:

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

Решение

Winpos

Первым делом нам надо написать функцию, которая будет возвращать True если игрок находиться в выигрышной позиции и False если игрок не находиться в выигрышной позиции.

Обозначим переменные count1 и count2 как количество камней в 1 и 2 куче соответственно.
Если изначально суммарное количество камней в кучах меньше 61

if (count1 + count2 < 61)

Enter fullscreen mode

Exit fullscreen mode

и при любом следующем ходе оно становиться больше либо равно 61

((count1 + count2 + 1 >= 61) or
(count1 * 4 + count2 >= 61) or 
(count1 + count2 * 4 >= 61))

Enter fullscreen mode

Exit fullscreen mode

то мы возвращаем True, что означает что игрок находиться в выигрышной позиции.
Иначе мы возвращаем False, что означает что игрок не находиться в выигрышной позиции.

def winpos(count1, count2):
    if (count1 + count2 < 61) and ((count1 + count2 + 1 >= 61) or
       (count1 * 4 + count2 >= 61) or (count1 + count2 * 4 >= 61)):
        return True
    else:
        return False

Enter fullscreen mode

Exit fullscreen mode

Первая функция готова, приступим к написанию следующей.

Losspos

Теперь нам надо написать функцию, которая будет возвращать True если игрок находится в проигрышной позиции и False если игрок не находится в проигрышной позиции.

Если изначально игрок не находиться в выигрышной позиции

if not winpos(count1, count2)

Enter fullscreen mode

Exit fullscreen mode

и каждый следующий ход противника является выигрышным

(winpos(count1 + 1, count2) and winpos(count1, count2 + 1) and
 winpos(count1 * 4, count2) and winpos(count1, count2 * 4))

Enter fullscreen mode

Exit fullscreen mode

то мы возвращаем True, что означает что игрок находиться в проигрышной позиции.
Иначе, мы возвращаем False, что означает что игрок не находиться в проигрышной позиции.

def losspos(count1, count2):
    if not winpos(count1, count2) and (winpos(count1 + 1, count2) and
        winpos(count1, count2 + 1) and winpos(count1 * 4, count2) and
        winpos(count1, count2 * 4)):
        return True
    else:
        return False

Enter fullscreen mode

Exit fullscreen mode

Вторая функция готова, осталась еще одна.

Prewinpos

Последняя функция должна возвращать True если игрок находится в предвыигрышной позиции и False если игрок не находится в предвыигрышной позиции.

Если изначально игрок не находится в выигрышной позиции

if not winpos(count1, count2)

Enter fullscreen mode

Exit fullscreen mode

и любой следующий ход противника является проигрышным

(losspos(count1 + 1, count2) or losspos(count1, count2 + 1) or
 losspos(count1 * 4, count2) or losspos(count1, count2 * 4)):

Enter fullscreen mode

Exit fullscreen mode

то мы возвращаем True, что означает что игрок находится в предвыигрышной позциии.
Иначе, мы возвращаем False, что означает что игрок не находиться в предвыигрышной позциии.

def prewinpos(count1, count2):
    if not winpos(count1, count2) and (losspos(count1 + 1, count2) or
        losspos(count1, count2 + 1) or losspos(count1 * 4, count2) or
        losspos(count1, count2 * 4)):
        return True
    else:
        return False

Enter fullscreen mode

Exit fullscreen mode

Основа готова, осталось просто перебрать значения, чем мы сейчас и займемся.

1 Задача

Условие задачи можно воспринимать так: «Ваня находиться в выигрышной позиции(выигрывает за один ход)».

Изначально в первой куче 3 камня

count1 = 3

Enter fullscreen mode

Exit fullscreen mode

а во второй куче S камней, 1 ≤ S ≤ 57

for s in range(1, 58):

Enter fullscreen mode

Exit fullscreen mode

Перебираем все возможные комбинации с S, при которых игрок находится в выигрышной позиции

if winpos(count1 + 1, s) or winpos(count1, s + 1) or
   winpos(count1 * 4, s) or winpos(count1, s * 4):

Enter fullscreen mode

Exit fullscreen mode

и если хоть одна такая комбинация существует, то мы выводим S на экран и прерываем цикл.

print("19:", s)
break

Enter fullscreen mode

Exit fullscreen mode

Получается следующий код, который решает эту задачу

count1 = 3
for i in range(1, 58):
    if winpos(count1 + 1, i) or winpos(count1, i + 1) or
        winpos(count1 * 4, i) or winpos(count1, i * 4):
        print("19:", i)
        break

Enter fullscreen mode

Exit fullscreen mode

2 Задача

Условие задачи можно воспринимать так: «Ваня находится в проигрышной позиции».

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

for i in range(1, 58):
    if losspos(count1 + 1, i) or losspos(count1, i + 1) or
        losspos(count1 * 4, i) or losspos(count1, i * 4):
        print("20:", i)

Enter fullscreen mode

Exit fullscreen mode

3 Задача

Условие задачи можно воспринимать так: «Ваня находиться или в выигрышной или в предвыигрышной позиции»

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

if (winpos(count1 + 1, i) or predwinpos(count1 + 1, i)) and 
   (winpos(count1, i + 1) or predwinpos(count1, i + 1)) and 
   (winpos(count1 * 4, i) or predwinpos(count1 * 4, i)) and 
   (winpos(count1, i * 4) or predwinpos(count1, i * 4)):
   print("21:", i)

Enter fullscreen mode

Exit fullscreen mode

2 Способ

Подробней с этим методом решения теории игр вы можете ознакомится на канале Алексея Кабанова

Мемоизация

Для оптимизации рекурсии подключим декоратор cache из модуля functools.

from functools import cache

Enter fullscreen mode

Exit fullscreen mode

Moves

Напишем функцию moves, которая принимает количество камней в обеих кучах и возвращает всевозможные варианты ходов.

def moves(heap):
    a, b = heap
    return (a + 1, b), (a * 4, b), (a, b + 1), (a, b * 4)

Enter fullscreen mode

Exit fullscreen mode

Game

Напишем функцию game, которая рекурсивно описывает игру.

@cache
def game(heap):
    if sum(heap) >= 61:
        return 0
    steps = [game(x) for x in moves(heap)]
    if any(x % 2 == 0 for x in steps):
        return min(x for x in steps if x % 2 == 0) + 1
    else:
        return max(steps) + 1

Enter fullscreen mode

Exit fullscreen mode

1-3 задача

Перебираем все значения s и выводим на экран необходимые данные.

for s in range(57, 0, -1):
    print(s, ": ", game((3, s)), " | ", [game(x) for x in moves((3, s))])

Enter fullscreen mode

Exit fullscreen mode

На выходе мы получаем полное дерево игры, в котором можно увидеть ответы на поставленные задачи.

Андрей Рогов


17.07.2021    

2 комментария    

Related Articles

Поиск по сайту

Версия для слабовидящих

Записи

  •  2022 (10)
    •  Май (1)
      • Обновление SSL сертификата вручную с помощью certbot
    •  Март (3)
      • Анализ результатов и разбор пробника от 01.02.2022
      • Как установить Python на Windows
      • Базовый ЕГЭ по информатике. Задание 4
    •  Февраль (5)
      • ОГЭ по информатике. Задание 14
      • Разбор задачи 4909 (Задание 18) с сайта К.Ю. Полякова
      • Разбор задачи 4905 (Задание 18) с сайта К.Ю. Полякова
      • Базовый ЕГЭ по информатике. Задание 11. Кодирование информации
      • Базовый ЕГЭ по информатике. Задание 10. Поиск в текстовом процессоре
    •  Январь (1)
      • ОГЭ по информатике. Задание 13.2
  •  2021 (37)
    •  Декабрь (11)
      • Анализ результатов и разбор заданий пробного ЕГЭ от 15.12.2021 от /dev/inf
      • Задание 26 из работы Статград от 17.12.2021. Формат «Дорешай»
      • Базовый ЕГЭ по информатике. Задание 2. Таблицы истинности
      • ОГЭ по информатике 2022. Задание 13.1
      • ОГЭ по информатике 2022. Задание 12
      • Разбор Статград 27.10.2021. Вариант 1. Подробное решение заданий 24-27
      • Разбор Статград 27.10.2021. Вариант 1. Подробное решение заданий 1-23
      • Базовый ЕГЭ по информатике. Задание 13. Пути в графе
      • Базовый ЕГЭ по информатике. Что это за курс
      • Разбор задачи 4406 с сайта К.Ю. Полякова
      • ОГЭ по информатике. Задание 11
    •  Октябрь (2)
      • Способы решения заданий ЕГЭ. Таблица с рекомендациями
      • Модуль CSV языка Python в решении задания 3 ЕГЭ по информатике
    •  Сентябрь (1)
      • Разбор заданий демоверсии ЕГЭ по информатике 2022
    •  Июль (7)
      • ЕГЭ по информатике 2021. Задание 27. Метод минимальной разности
      • ЕГЭ по информатике 2021. Задание 27. Метод частичных сумм
      • ЕГЭ по информатике 2021. Задание 27. Метод полных сумм
      • ЕГЭ по информатике 2021. Возможна ли автопроверка заданий на программирование на экзамене?
      • ЕГЭ по информатике 2021. Задания 19-21. Решение программированием на Python
      • ЕГЭ по информатике 2021. Задание 15. Решение программированием на Python
      • ЕГЭ по информатике 2021. Задание 8. Решение программированием на Python с помощью модуля itertools
    •  Июнь (1)
      • Решение задания 23 в электронных таблицах с помощью функции ИНДЕКС
    •  Май (5)
      • ЕГЭ по информатике 2021. Решение 23 задания в электронных таблицах в одну формулу
      • Разбор контрольной работы (ОГЭ) от 18.05.2021 по информатике
      • Контрольная работа (ОГЭ) 2021 по информатике. Экспресс-подготовка. Решаем вариант
      • Задание 25. Обработка целых чисел. Делимость
      • Coderunner (moodle plugin) и PascalABC в multilanguage question (Часть 2)
    •  Апрель (1)
      • ЕГЭ по информатике 2021. Задание 2. Таблицы истинности. Решение программированием на Python
    •  Март (6)
      • Задание 23 ЕГЭ по информатике. Решение программированием
      • Задание 23 ЕГЭ по информатике. Решение в электронных таблицах
      • Задание 23 ЕГЭ по информатике. Решение деревом
      • Режимы работы интерпретатора Python
      • Электронные таблицы и системы счисления (функция ОСНОВАНИЕ)
      • Модуль itertools для решения задания 8 ЕГЭ по информатике
    •  Февраль (3)
      • Кумир и новые версии ubuntu
      • Выбираем онлайн whiteboard
      • Установка компилятора python 3 на компьютер
  •  2020 (50)
    •  Декабрь (9)
      • ОГЭ по информатике 2021 Задание 10
      • ОГЭ по информатике 2021 Задание 9
      • ОГЭ по информатике 2021 Задание 8
      • ОГЭ по информатике 2021 Задание 7
      • ОГЭ по информатике 2021 Задание 6
      • ОГЭ по информатике 2021 Задание 5
      • ОГЭ по информатике 2021 Задание 4
      • ОГЭ по информатике 2021 Задание 3
      • ОГЭ по информатике 2021 Задание 2
    •  Октябрь (4)
      • ОГЭ по информатике 2021 Задание 1
      • КЕГЭ 2021. Графы. Задания 1 и 13
      • ОГЭ 2021. Как проходит. Разбор Демо 2021
      • Обзор изменений в процедуре сдачи ЕГЭ по информатике (КЕГЭ)
    •  Август (2)
      • Компьютеры на КЕГЭ. Откуда?
      • КЕГЭ 2021. Сравнение заданий с 2020
    •  Июнь (18)
      • Python 3. Списки 3. Сравнение списков и строк. Ссылочная адресация
      • Python 3. Списки 2. Поиск количества, суммы, произведения, минимума и максимума элементов
      • Python 3. Списки 1. Способы создания
      • Pascal. Массивы. Алгоритмы работы с массивами
      • Pascal. Массивы. Заполнение массива. Вывод массива
      • Информатика. Примеры решения задания ЕГЭ 25 на Python
      • Физика. Соединения конденсаторов
      • Физика. Электроемкость конденсатора
      • Физика. Электроемкость уединенного проводника
      • Физика. Потенциал и напряженность системы из шара и сферы (двух сфер)
      • Физика. Связь напряженности и потенциала
      • Физика. Электрические заряды, помещенные в диэлектрик
      • Физика. Проводники в электростатическом поле
      • Физика. Диэлектрики в электростатическом поле
      • Физика. Электрическое поле в веществе
      • Физика. Потенциал электростатического поля
      • Физика. Работа сил электростатического поля
      • Физика. Напряженность электростатического поля
    •  Май (2)
      • TRIK Studio. Задание на измерение глубины речного дна
      • TRIK Studio. Исполнитель Робот
    •  Апрель (2)
      • Чтение аргументов командной строки в coderunner (moodle plugin) для Python 3
      • Coderunner (moodle plugin) и PascalABC в multilanguage question
    •  Март (2)
      • Демоверсия ОГЭ 2020 по информатике. Задание 12
      • Демоверсия ОГЭ 2020 по информатике. Задание 11
    •  Январь (11)
      • Демоверсия ОГЭ 2020 по информатике. Задание 10
      • Демоверсия ОГЭ 2020 по информатике. Задание 9
      • Демоверсия ОГЭ 2020 по информатике. Задание 8
      • Демоверсия ОГЭ 2020 по информатике. Задание 7
      • Демоверсия ОГЭ 2020 по информатике. Задание 6
      • Демоверсия ОГЭ 2020 по информатике. Задание 5
      • Демоверсия ОГЭ 2020 по информатике. Задание 4
      • Демоверсия ОГЭ 2020 по информатике. Задание 3
      • Демоверсия ОГЭ 2020 по информатике. Задание 2
      • Демоверсия ОГЭ 2020 по информатике. Задание 1
      • Сравнение старой и новой моделей ОГЭ по информатике
  •  2019 (24)
    •  Август (5)
      • Решение варианта повышенного уровня ОГЭ. 5 задание
      • Решение варианта повышенного уровня ОГЭ. 4 задание
      • Решение варианта повышенного уровня ОГЭ. 3 задание
      • Решение варианта повышенного уровня ОГЭ. 2 задание
      • Решение варианта повышенного уровня ОГЭ. 1 задание
    •  Июнь (11)
      • Решение варианта базового уровня ОГЭ. Все задания
      • Решение варианта базового уровня ОГЭ. Задание 18
      • Решение варианта базового уровня ОГЭ. Задание 17
      • Решение варианта базового уровня ОГЭ. Задание 16
      • Решение варианта базового уровня ОГЭ. Задание 15
      • Решение варианта базового уровня ОГЭ. Задание 14
      • Решение варианта базового уровня ОГЭ. Задание 13
      • Решение варианта базового уровня ОГЭ. Задание 12
      • Решение варианта базового уровня ОГЭ. Задание 11
      • Решение варианта базового уровня ОГЭ. Задание 10
      • Решение варианта базового уровня ОГЭ. Задание 9
    •  Март (3)
      • Решение варианта базового уровня ОГЭ. Задание 8
      • Решение варианта базового уровня ОГЭ. Задание 7
      • Решение варианта базового уровня ОГЭ. Задание 6
    •  Февраль (5)
      • Решение варианта базового уровня ОГЭ. Задание 5
      • Решение варианта базового уровня ОГЭ. Задание 4
      • Решение варианта базового уровня ОГЭ. Задание 3
      • Решение варианта базового уровня ОГЭ. Задание 2
      • Решение варианта базового уровня ОГЭ. Задание 1
  •  2018 (10)
    •  Ноябрь (1)
      • Базовый вариант ОГЭ 2018
    •  Октябрь (1)
      • moodle 2.8 и reCAPTCHA v2
    •  Сентябрь (4)
      • Готовимся к ЕГЭ по информатике. Системы счисления. Решение задания №16. Часть 3
      • Готовимся к ЕГЭ по информатике. Системы счисления. Решение задания №16. Часть 2
      • Готовимся к ЕГЭ по информатике. Системы счисления. Решение задания №16. Часть 1
      • Готовимся к ЕГЭ по информатике. Системы счисления. Решение задания №1
    •  Август (1)
      • Видео. Ответы на вопросы по 9 заданию ОГЭ по информатике.
    •  Июль (1)
      • Видео. Ответы на вопросы по 3 заданию ОГЭ по информатике.
    •  Май (1)
      • Готовимся к ЕГЭ по информатике. Системы счисления [5/5]. Некоторые свойства чисел
    •  Апрель (1)
      • Готовимся к ЕГЭ по информатике. Системы счисления [4/5]. Перевод между 2, 8, 16
  •  2017 (14)
    •  Декабрь (1)
      • Готовимся к ЕГЭ по информатике. Системы счисления [3/5]. Перевод между недесятичными СС
    •  Ноябрь (1)
      • Список практических работ по графическому редактору GIMP
    •  Август (2)
      • Готовимся к ЕГЭ по информатике. Системы счисления [2/5]. Перевод в десятичную систему счисления
      • Готовимся к ЕГЭ по информатике. Системы счисления [1/5]. Перевод из десятичной системы счисления
    •  Июнь (2)
      • EV3 + Python = ev3dev. Часть 1.1 Где еще писать код.
      • EV3 + Python = ev3dev. Часть 1. Где писать код.
    •  Май (5)
      • Подготовка к средней основной категории WRO 2017
      • ОГЭ по информатике. Ответы на вопросы. Кузнечик и IP адрес.
      • ОГЭ по информатике. Как оценивается 20 задание
      • ОГЭ по информатике. Как оценивается 19 задание
      • Scratch + WeDo 1. Что нужно, чтобы заработало.
    •  Апрель (1)
      • ОГЭ информатика. Решение задания 2 с помощью таблиц истинности
    •  Март (1)
      • Подготовка к соревнованиям Робофест «Hello Robot Сортировщик 2017»
    •  Февраль (1)
      • Доска Smart Board SB480 в Debian 7
  •  2016 (26)
    •  Декабрь (1)
      • Готовимся к ЕГЭ. 1.1. Системы счисления. Теория.
    •  Ноябрь (1)
      • Открытие групп в социальных сетях для подготовки к ГИА по информатике
    •  Октябрь (1)
      • Почта Яндекс в белом списке squid
    •  Сентябрь (1)
      • PencilCode для старшеклассников — 1
    •  Июль (1)
      • Новый проект andrewson.ru
    •  Июнь (1)
      • WRO 2016 Всероссийский этап
    •  Апрель (2)
      • Scratch. Работа №1. Перемещения персонажа и перо
      • Городской фестиваль технического творчества учащихся 2016
    •  Март (3)
      • Подготовка к ОГЭ по информатике. Задание 20.2.
      • Подготовка к ОГЭ по информатике. Задание 20.1.
      • Итоги Робофест-Южный Урал
    •  Февраль (5)
      • Подготовка к ОГЭ по информатике. Задание 19.
      • Подготовка к ОГЭ по информатике. Особенности второй части экзамена
      • Анализ входящих ссылок
      • Подготовка к ОГЭ по информатике. 18 задание.
      • Подготовка к ОГЭ по информатике. 17 задание.
    •  Январь (10)
      • Подготовка к ОГЭ по информатике. 16 задание.
      • Подготовка к ОГЭ по информатике. 15 задание.
      • Подготовка к ОГЭ по информатике. 14 задание.
      • Подготовка к ОГЭ по информатике. 13 задание.
      • Подготовка к ОГЭ по информатике. 12 задание.
      • Подготовка к ОГЭ по информатике. 11 задание.
      • Подготовка к ОГЭ по информатике. 10 задание.
      • Подготовка к ОГЭ по информатике. 9 задание.
      • Подготовка к ОГЭ по информатике. 8 задание.
      • Подготовка к ОГЭ по информатике. 7 задание.
  •  2015 (20)
    •  Декабрь (7)
      • Итоги 2015 года
      • Подготовка к ОГЭ по информатике. 6 задание.
      • Подготовка к ОГЭ по информатике. 5 задание.
      • Подготовка к ОГЭ по информатике. 4 задание.
      • Подготовка к ОГЭ по информатике. 3 задание.
      • Подготовка к ОГЭ по информатике. 2 задание.
      • Подготовка к ОГЭ по информатике. 1 задание.
    •  Ноябрь (1)
      • Подготовка к ОГЭ по информатике. 0 урок. Нормативные документы, структура экзамена.
    •  Август (2)
      • Контроль ученических компьютеров с помощью Epoptes
      • Городской конкурс анимированных историй, разработанных в среде Scratch по теме «Литературная страна» — 2015
    •  Июнь (1)
      • WRO 2015. Дорога до Казани.
    •  Май (3)
      • П-регулятор в LEGO® MINDSTORMS® EV3
      • Рейтинг сайтов учителей «Зима 2015»
      • Конкурс «Учитель года — 2015». Областной этап.
    •  Март (2)
      • «Стандартные» алгоритмы языка Паскаль
      • Конкурс «Учитель года — 2015» Муниципальный этап.
    •  Январь (4)
      • Реализация аспектов образовательного проекта «ТЕМП» средствами практико-ориентированного подхода к изучению информатики
      • Робофест-Южный Урал 2015
      • Итоги муниципального этапа «Робофест — Урал 2015» г.Челябинск
      • Участие в соревнованиях «Гонки роботов»
  •  2014 (33)
    •  Декабрь (2)
      • Школьные соревнования «Биатлон Мини» 20 декабря 2014
      • Открытый урок «Цикл с условием»
    •  Ноябрь (2)
      • Конкурс «Новые проекты из старых журналов»
      • Семинары по программе «Робототехника» — ресурсные центры НКО
    •  Октябрь (2)
      • Стопоходящая машина Чебышева. Способ реализации.
      • WeDo — нет заданий в «Первые шаги» и «ActivityTab»
    •  Август (2)
      • Общероссийский рейтинг школьных сайтов. История участия по настоящее время.
      • Конспект занятия «Плавное движение по черной линии»
    •  Июль (3)
      • Соревнования «Кегельринг»
      • Участие в конкурсе анимированных историй в Scratch
      • Автоматическая парковка с конструктором лего
    •  Июнь (1)
      • Ремонт экрана NXT своими руками
    •  Май (4)
      • Занимательное программирование на Паскале 3. Математические «фокусы».
      • Занимательное программирование на Паскале 2. Игра “Однорукий бандит”.
      • Занимательное программирование на Паскале 1. Игра «Угадай число».
      • Использование сервиса «Яндекс.Фотки» для размещения изображений на сайте
    •  Апрель (3)
      • Scratch 2.0 в Linux
      • Приложения для мобильных устройств, полезные для информатики и ЕГЭ
      • Участие в соревнованиях «Захват флага», или история одной судейской ошибки
    •  Март (3)
      • Готовимся к WRO 2014. Спутник. Распознаем цвет спутника
      • Программа для соревнования «Биатлон» в NXT-G
      • Проведение пробного ЕГЭ по информатике
    •  Февраль (2)
      • Электронная запись в первый класс с помощью Google Docs
      • Монитор + проектор на Ubuntu 10.04
    •  Январь (9)
      • Алгоритм плавного движения по черной линии 3. Программирование в NXT-G
      • Алгоритм плавного движения по черной линии 2. Математика
      • Алгоритм плавного движения по черной линии 1. Конструирование
      • Окружные отборочные соревнования Робофест-Урал 2014
      • Создание космоса
      • Круглая кнопка в стиле web 2.0.
      • Новогодние обои
      • Светящийся текст 2
      • Светящийся текст
  •  2013 (64)
    •  Декабрь (13)
      • Исследовательская деятельность в сфере информационных технологий (из опыта работы).
      • Среднее значение показаний датчика в NXT-G
      • Общее понятие о слоях. Панель слоев. Создание слоя. — Практическая часть — Упражнение 3
      • Общее понятие о слоях. Панель слоев. Создание слоя. — Практическая часть — Упражнение 4
      • Общее понятие о слоях. Панель слоев. Создание слоя. — Практическая часть — Упражнение 2
      • Общее понятие о слоях. Панель слоев. Создание слоя — Теоретическая часть
      • Общее понятие о слоях. Панель слоев. Создание слоя. — Практическая часть — Упражнение 1
      • Работа с выделенными областями — Практическая часть — Упражнение 2
      • Работа с выделенными областями — Практическая часть — Упражнение 3
      • Работа с выделенными областями — Практическая часть — Упражнение 1
      • Работа с выделенными областями — Теоретическая часть
      • Знакомство с Gimp — Практическая часть — Упражнение 2
      • Знакомство с Gimp — Практическая часть — Упражнение 1
    •  Ноябрь (7)
      • Итоги Робофест-Урал 2013 (квалификация от 28 ноября)
      • Шаг в будущее. Развивающая программа «Черный ящик»
      • Шаг в будущее. Моделирование опыта по изучению силы упругости.
      • Что такое программа «Шаг в будущее»?
      • Итоги «Всероссийского конкурсе образовательных сайтов «Педагогический рейтинг рунета»
      • Электронный документооборот в школе: теория и реальность
      • Семинары First Lego Ligue в Новосибирске и Томске
    •  Октябрь (3)
      • Пароль на запуск программы в Linux
      • Виртуальная машина на Ubuntu Server 12.04 с веб-сайтом
      • Кроссплатформенный аудиоплеер
    •  Сентябрь (6)
      • Школьный сервер. Часть 7. Раздача интернета и DHCP сервер.
      • Школьный сервер. Часть 8. SSH сервер.
      • Планирование кружка «Легоконструирование» на 4 года (2 занятия в неделю)
      • Школьный сервер. Часть 6. Webmin.
      • Школьный сервер. Часть 5. Графический интерфейс.
      • Общероссийский рейтинг образовательных сайтов за лето 2013 года.
    •  Август (6)
      • Подбор страниц, связанных с интерактивной доской
      • Репост. Интересная статья «Дети не умеют пользоваться компьютерами… И вот почему это должно вас беспокоить»
      • Школьный сервер. Часть 4. Установка серверной ОС.
      • Школьный сервер. Часть 3. Исходные данные.
      • Школьный сервер. Часть 2. Выбор дистрибутива и ПО
      • Школьный сервер. Часть 1. Задачи школьного сервера.
    •  Июль (2)
      • Летний лагерь. Соревнования.
      • Летний лагерь. Подготовка к соревнованиям.
    •  Июнь (8)
      • Летний лагерь. День шестой.
      • Летний лагерь. День пятый.
      • Летний лагерь. День четвертый.
      • Плагины моего сайта
      • И снова новый хостинг
      • Летний лагерь. День третий
      • Летний лагерь. День второй.
      • Летний лагерь. День первый.
    •  Май (4)
      • Настройка веб-сервера на основе Linux Mint
      • Задачи на логику
      • Дистанционное управление NXT через Bluetooth
      • Установка Lego Mindstorm NXT на Windows Starter (обновление)
    •  Апрель (8)
      • Подборка видео про Сумо лего-роботов
      • Биатлон Лего-роботов
      • Кегельринг. Анализ задания. Практические наброски.
      • Разбор C4 25 апреля
      • Создание страницы (записи) в wordpress с подключением jQuery
      • Участие в XVII Олимпиаде технического творчества учащихся (робототехническое направление)
      • Подготовка к V городскому фестивалю технического творчества
      • Муниципальный этап WRO 2013 г.Челябинск
    •  Март (5)
      • Городской этап WRO Челябинск
      • Робот для WRO Баробудур
      • Сайты, связанные с Лего
      • Виджеты со 101widgets.com
      • Новый хостинг
    •  Февраль (2)
      • First Lego Ligue
      • Hello Robot
  •  2012 (38)
    •  Декабрь (2)
      • Transport Tycoon Deluxe на Linux, или Open TTD
      • Уменьшаем шок от перехода на Linux
    •  Ноябрь (2)
      • Планирование кружка Лего (210 часов)
      • Установка Lego Mindstorm NXT 2.0 на Windows 7 Starter
    •  Октябрь (1)
      • Различные программы для использования в образовании
    •  Сентябрь (10)
      • Практические работы по моделированию
      • «Соло на клавиатуре» for Linux (перепост)
      • Информация и информационные процессы
      • Общие сведения об установке
      • Разбиение дисков при установке
      • Запрет на создание файлов и папок на рабочем столе
      • Снятие скриншотов в Росинке
      • Настройка беспроводной сети в Linux «Росинка»
      • Внешний вид десктопа
      • Выбор ОС для ОУ
    •  Июнь (1)
      • Сатира
    •  Май (3)
      • Лабораторная работа «Создание презентации с использованием гиперссылок в LibreOffice.org Impress»
      • Какие плагины wordpress я использую
      • Почему WordPress?
    •  Апрель (11)
      • Статья «Организация исследовательской деятельности учащихся на элективных занятиях по физике в старшей профильной школе»
      • Презентация «Ребусы»
      • Конспект урока на тему «Анализ статистической обработки данных»
      • Программа элективного курса «Компьютерная графика»
      • Облачное хранение файлов на Яндекс.Диск
      • Moodle в школе
      • Домашнее задание по алгебре логики
      • По следам контрольных работ
      • Записки пользователя Linux
      • Проектная работа «Свой сайт»
      • HTML-редактор под Linux
    •  Март (1)
      • Размышления о СПО
    •  Февраль (1)
      • Материалы по HTML
    •  Январь (6)
      • Фантастическое произведение «Школа будущего»
      • Какой я вижу школу будущего
      • Завершился районный конкурс «Учитель года-2012»
      • Файлы и файловая система
      • История языка гипертекстовой разметки HTML
      • Презентация по теме «Алгоритмизация и программирование»
  •  2011 (8)
    •  Декабрь (6)
      • Собственный опыт использования ОС Linux
      • Самостоятельная работа по теме «Перевод чисел из одной системы счисления в другую»
      • Программа кружка «Мастерская лего»
      • Шаги перехода на ПСПО
      • Информационные процессы
      • Моя педагогическая философия
    •  Ноябрь (1)
      • Виртаульная лабораторная работа «Определение плотности газа»
    •  Сентябрь (1)
      • Виртуальная лабораторная работа «Определение силы упругости»

Последние записи

  • Обновление SSL сертификата вручную с помощью certbot
    04.05.2022
  • Анализ результатов и разбор пробника от 01.02.2022
    31.03.2022
  • Как установить Python на Windows
    31.03.2022
  • Базовый ЕГЭ по информатике. Задание 4
    31.03.2022
  • ОГЭ по информатике. Задание 14
    23.02.2022

Метки

Поставь лайк и подпишись на канал!
Пишем рекурсивную функцию для решения задач 19 20 21 из обновленного формата ЕГЭ по информатике

Подпишись на рассылку полезных материалов: https://vk.com/app5898182_-193161870#s=1220963

Открыта запись на курс по второй части: https://infogram.online
Скачать программу курса можно тут: https://yadi.sk/i/JiSFF1TQPXdLzw

Подписывайся на мой инстаграм: https://www.instagram.com/semen_infogram/

Разделы видео:
00:00 Начало
01:01 Задача 19 Крылов 2021
07:17 Задача 20 Крылов 2021
11:00 Задача 21 Крылов 2021
16:00 Окончание.

Все права на задачи принадлежат их авторам

Видео Решаем задачи 19 20 21 по теории игр на Python очень просто через рекурсию ЕГЭ 2021 по информатике канала ДНЕВНИК ЭКСПЕРТА ЕГЭ

Показать

Канал видеоролика: Подготовка к ЕГЭ

Задание 19-21 на множествах Python - ЕГЭ по информатике 2022

Смотреть видео:

#информатика #егэинформатика #икт #экзамены #егэ_2020 #мгту #школьникам #помощь_студентам #подготовкакэкзаменам

Свежая информация для ЕГЭ и ОГЭ по Информатике (листай):

С этим видео ученики смотрят следующие ролики:

Задание 19-21 на множествах Python - ЕГЭ по информатике 2022

Задание 19-21 на множествах Python — ЕГЭ по информатике 2022

Подготовка к ЕГЭ

ЕГЭ по информатике 2021. Задание 2. Таблицы истинности. Решение программированием на Python

ЕГЭ по информатике 2021. Задание 2. Таблицы истинности. Решение программированием на Python

ГИА по информатике

Задание 9 на Python - Демоверсия ЕГЭ по информатике - 2022

Задание 9 на Python — Демоверсия ЕГЭ по информатике — 2022

Подготовка к ЕГЭ

Задание 3 на Python - Демоверсия ЕГЭ по информатике - 2022

Задание 3 на Python — Демоверсия ЕГЭ по информатике — 2022

Подготовка к ЕГЭ

Облегчи жизнь другим ученикам — поделись! (плюс тебе в карму):

22.02.2022

Решение задач ЕГЭ по информатике по теме «Рекурсивный алгоритм». Журавлева Ел...

Описание презентации по отдельным слайдам:

  • Решение задач ЕГЭ по информатике по теме «Рекурсивный алгоритм». Журавлева Ел...

    1 слайд

    Решение задач ЕГЭ по информатике по теме «Рекурсивный алгоритм». Журавлева Елена Викторовна учитель информатики высшей квалификационной категории МБОУ СОШ №53 г.Набережные Челны

  • Задание 11 Умение исполнить рекурсивный алгоритм базовый уровень 1 балл

    2 слайд

    Задание 11 Умение исполнить рекурсивный алгоритм базовый уровень 1 балл

  • Рекурсия — это определение объектов через самих себя, вызов функции (процедур...

    3 слайд

    Рекурсия — это определение объектов через самих себя, вызов функции (процедуры) из неё же самой или через другие рекурсии. Рекурсия обычно используется тогда, когда в результате исходная задача сводится к более простой. Любую рекурсивную процедуру можно запрограммировать с помощью цикла. Рекурсия позволяет заменить цикл и в некоторых сложных задачах делает решение более понятным, хотя часто менее эффективным.

  • При решении задачи бывает необходимо разделять программу на отдельные части,...

    4 слайд

    При решении задачи бывает необходимо разделять программу на отдельные части, которые называются подпрограммами. Подпрограмма — это повторяющаяся группа операторов, оформленная в виде самостоятельной программной единицы. Она записывается однократно, а в соответствующих местах программы обеспечивается лишь обращение к ней по имени. Подпрограммы делятся на две категории: процедуры и функции. Для удобства передачи данных в процедуру и получения из неё результата используются формальные и фактические параметры. Формальные — условные обозначения в описании процедуры — описываются в её заголовке. Фактические — с которыми требуется выполнить процедуру — перечисляются при вызове процедуры.

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

    5 слайд

    Вызов рекурсивных процедур Алгоритмы, опирающиеся на несколько предыдущих значений Алгоритмы, опирающиеся на одно предыдущее значение Рекурсивные алгоритмы:

  • Вызов рекурсивных процедур

    6 слайд

    Вызов рекурсивных процедур

  • procedure F(n:integer); begin          writeln(n);          if n &gt; 1 then    ...

    7 слайд

    procedure F(n:integer); begin          writeln(n);          if n > 1 then              begin     F(n — 1);  F(n – 3) end      end; № 7783. Чему равна сумма всех чисел, напечатанных на экране при выполнении вызова F(6)? F(6) 6 Печать 6 F(5) F(3) 5 3 5 F(4) F(2) 4 2 Построение дерева вызовов 4 F(3) F(1) 3 1 3 F(2) F(0) 0 2 2 F(1) F(-1) 1 -1 1 -1 0 1 2 F(1) F(-1) 1 -1 1 -1 3 F(2) F(0) 2 0 2 F(1) F(-1) 1 -1 1 -1 0 Сумма = 28

  • procedure F(n: integer); forward; procedure G(n: integer); forward;   procedu...

    8 слайд

    procedure F(n: integer); forward; procedure G(n: integer); forward;   procedure F(n: integer); begin      if n > 0 then G(n — 1); end;   procedure G(n: integer); begin      writeln(‘*’);      if n > 1 then F(n — 2); end; № 8099. Сколько символов «звёздочка» будет напечатано на экране при выполнении вызова F(11)? построение последовательности вызовов F(11) G(10) * F(8) G(7) * F(5) G(4) * F(2) G(1) * Ответ: 4

  • Используя Forward-описания (предописания), вы можете делать процедуры или фун...

    9 слайд

    Используя Forward-описания (предописания), вы можете делать процедуры или функции известными без фактического определения ее операторной части. С точки предописания, другие процедуры и функции могут вызывать предописанную подпрограмму, делая возможной взаимную рекурсию.

  • function F(n: integer): integer; begin    if n &gt; 2 then      F := F(n - 1) +...

    10 слайд

    function F(n: integer): integer; begin    if n > 2 then      F := F(n — 1) + G(n — 2)    else     F := 1; end; function G(n: integer): integer; begin  if n > 2 then      G := G(n — 1) + F(n — 2)    else     G := 1; end; № 9761. Чему будет равно значение, вычисленное при выполнении вызова F(7)? F(7) = F(6) + G(5) = 8 + 5 = 13 F(1) = 1 F(2) = 1 G(1) = 1 G(2) = 1 F(3) = F(2) + G(1) = 2 F(4) = F(3) + G(2)= 1 + 2 = 3 F(5) = F(4) + G(3) = 3 + 2 = 5 G(3) = G(2) + F(1) = 2 F(6) = F(5) + G(4) = 5 + 3 = 8 G(4) = G(3) + F(2) = 3 G(5) = G(4) + F(3) = 5 Ответ: 13

  • Алгоритмы, опирающиеся на несколько предыдущих значений

    11 слайд

    Алгоритмы, опирающиеся на несколько предыдущих значений

  • function F(n: integer): integer;      begin           if n &gt; 2 then  F := F(n...

    12 слайд

    function F(n: integer): integer;      begin           if n > 2 then  F := F(n — 1) + F(n — 2)          else  F := n;      end; 7922 Чему будет равно значение, вычисленное алгоритмом при выполнении вызова F(5)? + 2 + 2 + 1 F(5) = F(4) + F(3) = F(3) + F(2) + F(2) + F(1) = F(2) + F(1) = 2+1+ 2 + 2 + 1 = 8

  • № 4650. Последовательность чисел задается рекуррентным соотношением: F(1) = 0...

    13 слайд

    № 4650. Последовательность чисел задается рекуррентным соотношением: F(1) = 0 F(2) = 1 F(3) = 1 F(n) = F(n–3) + F(n–2) + F(n–1), при n >3, где n – натуральное число. Чему равно девятое число в последовательности? В ответе запишите только натуральное число. F(4) = F(1) + F(2) + F(3) = 2 F(5) = F(2) + F(3) + F(4) = 4 F(6) = F(3) + F(4) + F(5) = 7 F(7) = F(4) + F(5) + F(6) = 13 F(8) = F(5) + F(6) + F(7) = 24 F(9) = F(6) + F(7) + F(8) = 44

  • Алгоритмы, опирающиеся на одно предыдущее значение

    14 слайд

    Алгоритмы, опирающиеся на одно предыдущее значение

  • № 4642. Алгоритм вычисления значения функции F(n), где n – натуральное число,...

    15 слайд

    № 4642. Алгоритм вычисления значения функции F(n), где n – натуральное число, задан следующими соотношениями: F(1) = 3 F(n) = F(n–1) * (n–1), при n >1 Чему равно значение функции F(6)? F(2) = F(1) * 1 = 3 F(3) = F(2) * 2 = 6 F(4) = F(3) * 3 = 18 F(5) = F(4) * 4 = 72 F(6) = F(5) * 5 = 360

  • Используемые источники: В.Р. Лещинер, М.А. Ройтберг. МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИ...

    16 слайд

    Используемые источники: В.Р. Лещинер, М.А. Ройтберг. МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ для учителей, подготовленные на основе анализа типичных ошибок участников ЕГЭ 2015 года по ИНФОРМАТИКЕ и ИКТ. – ФЕДЕРАЛЬНЫЙ ИНСТИТУТ ПЕДАГОГИЧЕСКИХ ИЗМЕРЕНИЙ, Москва, 2015 http://inf.ege.sdamgia.ru/test?theme=279

  • Спасибо за внимание.

    17 слайд

    Спасибо за внимание.

Краткое описание документа:

Решение задач ЕГЭ по информатике по теме «Рекурсивный алгоритм». Журавлева Елена Викторовна учитель информатики высшей квалификационной категории МБОУ СОШ №53 г.Набережные Челны

Задание 11 Умение исполнить рекурсивный алгоритм базовый уровень 1 балл

Рекурсия — это определение объектов через самих себя, вызов функции (процедуры) из неё же самой или через другие рекурсии. Рекурсия обычно используется тогда, когда в результате исходная задача сводится к более простой. Любую рекурсивную процедуру можно запрограммировать с помощью цикла. Рекурсия позволяет заменить цикл и в некоторых сложных задачах делает решение более понятным, хотя часто менее эффективным.

При решении задачи бывает необходимо разделять программу на отдельные части, которые называются подпрограммами. Подпрограмма — это повторяющаяся группа операторов, оформленная в виде самостоятельной программной единицы. Она записывается однократно, а в соответствующих местах программы обеспечивается лишь обращение к ней по имени. Подпрограммы делятся на две категории: процедуры и функции. Для удобства передачи данных в процедуру и получения из неё результата используются формальные и фактические параметры. Формальные — условные обозначения в описании процедуры — описываются в её заголовке. Фактические — с которыми требуется выполнить процедуру — перечисляются при вызове процедуры.

Вызов рекурсивных процедур Алгоритмы, опирающиеся на несколько предыдущих значений Алгоритмы, опирающиеся на одно предыдущее значение Рекурсивные алгоритмы:

Вызов рекурсивных процедур

procedure F(n:integer); begin          writeln(n);          if n > 1 then              begin     F(n — 1);  F(n – 3) end      end; № 7783. Чему равна сумма всех чисел, напечатанных на экране при выполнении вызова F(6)? F(6) 6 Печать 6 F(5) F(3) 5 3 5 F(4) F(2) 4 2 Построение дерева вызовов 4 F(3) F(1) 3 1 3 F(2) F(0) 0 2 2 F(1) F(-1) 1 -1 1 -1 0 1 2 F(1) F(-1) 1 -1 1 -1 3 F(2) F(0) 2 0 2 F(1) F(-1) 1 -1 1 -1 0 Сумма = 28

procedure F(n: integer); forward; procedure G(n: integer); forward;   procedure F(n: integer); begin      if n > 0 then G(n — 1); end;   procedure G(n: integer); begin      writeln(‘*’);      if n > 1 then F(n — 2); end; № 8099. Сколько символов «звёздочка» будет напечатано на экране при выполнении вызова F(11)? построение последовательности вызовов F(11) G(10) * F(8) G(7) * F(5) G(4) * F(2) G(1) * Ответ: 4

Используя Forward-описания (предописания), вы можете делать процедуры или функции известными без фактического определения ее операторной части. С точки предописания, другие процедуры и функции могут вызывать предописанную подпрограмму, делая возможной взаимную рекурсию.

function F(n: integer): integer; begin    if n > 2 then      F := F(n — 1) + G(n — 2)    else     F := 1; end; function G(n: integer): integer; begin  if n > 2 then      G := G(n — 1) + F(n — 2)    else     G := 1; end; № 9761. Чему будет равно значение, вычисленное при выполнении вызова F(7)? F(7) = F(6) + G(5) = 8 + 5 = 13 F(1) = 1 F(2) = 1 G(1) = 1 G(2) = 1 F(3) = F(2) + G(1) = 2 F(4) = F(3) + G(2)= 1 + 2 = 3 F(5) = F(4) + G(3) = 3 + 2 = 5 G(3) = G(2) + F(1) = 2 F(6) = F(5) + G(4) = 5 + 3 = 8 G(4) = G(3) + F(2) = 3 G(5) = G(4) + F(3) = 5 Ответ: 13

Алгоритмы, опирающиеся на несколько предыдущих значений

function F(n: integer): integer;      begin           if n > 2 then  F := F(n — 1) + F(n — 2)          else  F := n;      end; 7922 Чему будет равно значение, вычисленное алгоритмом при выполнении вызова F(5)? + 2 + 2 + 1 F(5) = F(4) + F(3) = F(3) + F(2) + F(2) + F(1) = F(2) + F(1) = 2+1+ 2 + 2 + 1 = 8

№ 4650. Последовательность чисел задается рекуррентным соотношением: F(1) = 0 F(2) = 1 F(3) = 1 F(n) = F(n–3) + F(n–2) + F(n–1), при n >3, где n – натуральное число. Чему равно девятое число в последовательности? В ответе запишите только натуральное число. F(4) = F(1) + F(2) + F(3) = 2 F(5) = F(2) + F(3) + F(4) = 4 F(6) = F(3) + F(4) + F(5) = 7 F(7) = F(4) + F(5) + F(6) = 13 F(8) = F(5) + F(6) + F(7) = 24 F(9) = F(6) + F(7) + F(8) = 44

Алгоритмы, опирающиеся на одно предыдущее значение

№ 4642. Алгоритм вычисления значения функции F(n), где n – натуральное число, задан следующими соотношениями: F(1) = 3 F(n) = F(n–1) * (n–1), при n >1 Чему равно значение функции F(6)? F(2) = F(1) * 1 = 3 F(3) = F(2) * 2 = 6 F(4) = F(3) * 3 = 18 F(5) = F(4) * 4 = 72 F(6) = F(5) * 5 = 360

Используемые источники: В.Р. Лещинер, М.А. Ройтберг. МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ для учителей, подготовленные на основе анализа типичных ошибок участников ЕГЭ 2015 года по ИНФОРМАТИКЕ и ИКТ. – ФЕДЕРАЛЬНЫЙ ИНСТИТУТ ПЕДАГОГИЧЕСКИХ ИЗМЕРЕНИЙ, Москва, 2015 http://inf.ege.sdamgia.ru/test?theme=279

Спасибо за внимание.

19 задание егэ информатика на питоне рекурсия

  • Сейчас обучается 861 человек из 78 регионов

19 задание егэ информатика на питоне рекурсия

  • Сейчас обучается 51 человек из 23 регионов

19 задание егэ информатика на питоне рекурсия

  • Сейчас обучается 224 человека из 62 регионов

Найдите материал к любому уроку, указав свой предмет (категорию), класс, учебник и тему:

5 841 383 материала в базе

Вам будут интересны эти курсы:

  • Курс повышения квалификации «Информационные технологии в деятельности учителя физики»

  • Курс повышения квалификации «Методика преподавания информатики в начальных классах»

  • Курс повышения квалификации «Внедрение системы компьютерной математики в процесс обучения математике в старших классах в рамках реализации ФГОС»

  • Курс повышения квалификации «Организация работы по формированию медиаграмотности и повышению уровня информационных компетенций всех участников образовательного процесса»

  • Курс профессиональной переподготовки «Информатика: теория и методика преподавания в образовательной организации»

  • Курс повышения квалификации «Облачные технологии в образовании»

  • Курс повышения квалификации «Сетевые и дистанционные (электронные) формы обучения в условиях реализации ФГОС по ТОП-50»

  • Курс повышения квалификации «Развитие информационно-коммуникационных компетенций учителя в процессе внедрения ФГОС: работа в Московской электронной школе»

  • Курс профессиональной переподготовки «Информационные технологии в профессиональной деятельности: теория и методика преподавания в образовательной организации»

  • Курс повышения квалификации «Использование компьютерных технологий в процессе обучения в условиях реализации ФГОС»

  • Курс повышения квалификации «Введение в программирование на языке С (СИ)»

  • Курс профессиональной переподготовки «Математика и информатика: теория и методика преподавания в образовательной организации»

  • Курс повышения квалификации «Современные тенденции цифровизации образования»

19 задание егэ информатика на питоне рекурсия

Три бомбических блока за 10 дней: основы Python, современное программирование и внутреннее устройство языка. Задача курса сформировать в твоей голове понимание «я могу этому научиться»

Ждём тебя✨

19 задание егэ информатика на питоне рекурсия


Коля Касперский
Учитель

990 ₽ 19 задание егэ информатика на питоне рекурсия

Что будет на курсе?

Этот курс ‐ это обзор возможностей языка Python, который пригодится как в универе, так и в дальнейшей жизни. Курс построен с нуля и условно его можно разделить на три блока: основы Python, современное программирование и внутреннее устройство языка. Задача курса сформировать в твоей голове понимание «я могу этому научиться»

🔥После курса ты сможешь изучать Python самостоятельно. На курсе будет теория, объяснения и практика. Практика построена на примерах из IT, медицины и биологии, например, задачи на анализ генома

19 задание егэ информатика на питоне рекурсия 19 задание егэ информатика на питоне рекурсия 19 задание егэ информатика на питоне рекурсия 19 задание егэ информатика на питоне рекурсия

19 задание егэ информатика на питоне рекурсия

Твой преподаватель

Коля Касперский

Информатика

Информатика, аниме, мемы — главное не перепутать порядок.

подробнее о преподе

7 учеников сдали ЕГЭ на 100 баллов

каждый 2-ой на 80+ баллов

каждый 5-ый на 90+

все стобальники вебиума

Расписание курса

Введение в Python и Collab Research

Функциональное программирование

Объектно Ориентированное Программирование

Бонусный урок. Tilda. Твой первый заработок

Математические библиотеки

Задание на финальный проект

Вот что говорят наши выпускники

19 задание егэ информатика на питоне рекурсия

Полина Щербакова

Весь 11-ый класс познавала информатику с Касперским, сдала ЕГЭ на 96 баллов и счастлива! А потом решила пойти на курс по питону, и не пожалела) Очень понравилась программа, как будто маленький экскурс в мир программирования. После курса лучше стала понимать, что меня ждёт в вузе. Кстати, это отличная возможность понять, действительно ли тебе нравится программирование и готов ли ты с этим связывать свою жизнь и дальше копаться во всяких интересных штуках)) Уже сейчас, сидя на парах по математике, я могу провести параллели со структурой языка программирования и понять, зачем мы проходим ту или иную тему. Из минусов могу выделить только то, что не было проверки дз, но на самом деле, можно было справиться и без этого) В общем, советую!!

19 задание егэ информатика на питоне рекурсия

Марат Мухамедьянов

Курс Python для ВУЗа оставил только положительные эмоции
Понравилось всё, от подачи материала до красивого окончания вебов 😊
Такого ощущения, что вот, мне это не нравится, не было 😉 Абсолютно все мои ожидания оправдались, получил то, чего хотел. В чате курса было активное обсуждение решения ДЗ, и быть может было бы интереснее организовать время для, например, созвонов в зуме и там делиться своими идеями и мыслями по задачам. 🤠Всё было супер, спасибо😃

19 задание егэ информатика на питоне рекурсия

Антонина Шлыкова

Всем привет, кто читает этот отзыв! Я бакалавр питерского Политеха по направлению Биотехнология и этот курс я решила пройти в промежуток между защитой диплома и поступлением на магистратуру по той же специальности. Дело в том, что в сфере биотехнологии нередко приходится работать с огромным количеством объемных и однообразных данных, обработка которых в Excel или вручную очень утомительна или просто невозможна.

Ранее я не имела никаких навыков работы с языками программирования от слова совсем, поэтому немного волновалась, буду ли вообще что либо понимать на курсе. Должна сказать, что была в шоке, когда после первого же занятия у меня получилось сделать 4 из 7 заданий. Визжала как счастливый ребенок, когда программа адекватно запрашивала данные и адекватно обрабатывала их за считанные секунды. Спасибо Коле за это!!

Занятия проходили очень увлекательно и нетривиально — ни секунды скуки, теоретический материал всегда разбавлен шутками, Коля чувствует, когда нужно разрядить обстановку, а когда можно добавить немного дополнительного материала для общего развития. На все свои вопросы (иногда абсурдно базовые) Коля давал исчерпывающие ответы на занятиях. Ко многим операциям и концепциям Коля объяснил возможное применение. Порадовало, что все, что я изучила за курс, реально можно было использовать для решения моих внутренних научных проблем. Вне занятий в беседе курса было интересно посмотреть, как каждый по-своему решает одно и то же задание.

Самое приятное то, что курс оправдал ожидания, которые я на него накладывала. В описании говорилось, что курс поможет приобрести установку «Я могу!», именно это и произошло. Сейчас я вполне реально рассматриваю возможность взять курсы программирования на питоне для биологов уже в своей магистерской программе. Страх программирования, как чего-то шаманского, пропал!

Я могу! :)
Спасибо Коле и его команде за это чувство!

19 задание егэ информатика на питоне рекурсия

Полина Галаганова

Мое направление в университете очень-очень косвенно связано с IT. В общем-то я и не планировала заниматься техническими дисциплинами в ВУЗе от слова совсем, но мне хотелось быстро и качественно освоить базу самого удобного языка программирования. Еще хуже: я никогда серьезно не учила информатику, поэтому для меня все команды и синтаксис — это дивный новый мир. Я переживала, что ничего не пойму и просто потрачу время.

Зря боялась. Колин курс очень доступен для новичков: даже на первых занятиях было не сложно понять, о чем идет речь. Гораздо больше пользы будет, если у вас уже есть база, но если ее нет и вы такой же профан, как я — все равно занимайтесь у Касперского, потому что писать базовые программы вы научитесь моментально (честное слово, даже у меня и моего ноля за информатику первое задание получилось).

Мне очень понравился подход к темам. Не было загонов вроде :»Очень страшна, вырубай», — Коля все подробно объяснял и отвечал на любые (даже очень «глупые») вопросы. (И Тонины комментарии насчет Колиного английского языка — это огонь, на всю жизнь останутся в моем сердечке)

Питон разбирался на пальцах и на куче разных примеров из жизни, даже куда-то философия приплеталась. В общем бóльшая часть базы (за исключением всяких штук с четвертого курса ВУЗа) была понятна.

Подбешивала меня только платформа, с которой мы работали — проблема моего невывозящего компьютера. 🙃

Скриптов нет, но это удобно: к каждому занятию прикрепляется «кодильник», в котором собрано все-все, что разбиралось на вебе.

В целом курс отличный и очень информативный.

UPDATE: на второй неделе учебы у меня повились два предмета (Медиакуммуникационные технологии и Информатика) — Колин курс стал в 10 раз полезнее, потому что мы год будем проходить то, что Касперский и Гречка объяснили за неделю. Отдельное спасибо за Тильду: зачет по медкому — это создание лонгрида на ней (хочу думать, что «отлично» у меня уже в кармане). ❤❤❤

больше отзывов в

Задача 1

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

Задача 2

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

Задача 3

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

Задача 4

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

Задача 5

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

Задача 6

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

Задача 7

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

Задача 8

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

Задача 9

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

Задача 10

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

Задача 11

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

Задача 12

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

Задача 13

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

Задача 14

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

Задача 15

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

Задача 16

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

Задача 17

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

Задача 18

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

Задача 19

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

Задача 20

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

1.

РЕШЕНИЕ ЗАДАНИЙ 19-21
ПРОГРАММИРОВАНИЕМ
суммарное время решения задач 19-21: 22 минуты

2.

ПОРЯДОК РЕШЕНИЯ
Если Вы собираетесь решать задания 19-21 через программирование, то есть 2
варианта:
• начинать решать не с 19-го задания, а с 20-го или с 21-го;
• решить 19-е задание на бумажке, 20 и 21 – через программу.
В любом случае полученные программой ответы нужно проверить вручную,
т.к. в программе нельзя задать условия вот такого типа:
• Петя не может выиграть за один ход, но может выиграть своим вторым
ходом независимо от того, как будет ходить Ваня;
• у Вани нет стратегии, которая позволит ему гарантированно выиграть
первым ходом, но есть выигрышная стратегия, позволяющая ему выиграть
первым или вторым ходом при любой игре Пети.
И в том, и в другом случае программа выдаёт одинаковые числа (2 хода), т.е.
проверять возможность выигрыша за 1 ход нужно самостоятельно.

3.

О ПРОГРАММЕ
Есть несколько способов написать программу для решения задачи,
наиболее оптимальной по времени будет программа, решающая задачу
с помощью динамического программирования и сохраняющая
результаты в таблицу. В программе оба игрока не допускают ошибок
при игре, т.е. её можно использовать как для определения выигрышных
позиций как Вани, так и Пети.
Те места в программе, которые нужно будет менять в зависимости от
условий задачи, будут выделены жёлтым маркером. Всё остальное
остаётся неизменным (по крайней мере для решения задач 20-21).
Значения чисел в итоговой таблице:
Х – выигрыш Пети за Х ходов (например, 2 это выигрыш Пети за 2 хода);
-X – выигрыш Вани за Х ходов (например, -3 это выигрыш Вани за 3
хода).

4.

СТРУКТУРА ПРОГРАММЫ
1) создание таблицы, в которой будут храниться результаты игры;
2) рекурсивное заполнение таблицы с результатами (при этом
смысл чисел в таблице меняется: если в итоговом выводе число
5 означает победу Пети на 5 ходе, то при рекурсивном
заполнении таблицы число 5 в проверке будет означать
выигрыш Вани на 5 ходе, а не Пети);
3) вывод результатов (при этом никак не помечается, мог ли игрок
выиграть за меньшее количество ходов при другой игре
соперника: результаты нужно перепроверять вручную, в ответ
попадает самая длинная игра).

5.

ТИП 1: КОЛИЧЕСТВО
КАМНЕЙ В КУЧАХ
УВЕЛИЧИВАЕТСЯ

6.

1: УСЛОВИЕ
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает
Петя. За один ход игрок может добавить в одну из куч (по своему выбору) один камень или увеличить количество камней в куче в два
раза. Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 77. Победителем считается игрок,
сделавший последний ход, т.е. первым получивший такую позицию, при которой в кучах будет 77 или больше камней. В начальный
момент в первой куче было семь камней, во второй куче – S камней; 1 ≤ S ≤ 69.
Задание 19.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение S, когда такая
ситуация возможна.
Задание 20.
Найдите два таких значения S, при которых у Пети есть выигрышная стратегия, причём одновременно выполняются два условия:
− Петя не может выиграть за один ход;
− Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.
Найденные значения запишите в ответе в порядке возрастания.
Задание 21
Найдите минимальное значение S, при котором одновременно выполняются два условия:
– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

7.

1: СОЗДАНИЕ ТАБЛИЦЫ
19-е задание пропускаем, сначала решаем 20-е задание.
Код ниже создаёт таблицу из SUMMA*2 строк и SUMMA*2 колонок:
SUMMA = 77
t = [ [0]*2*SUMMA for i in range(2*SUMMA) ]
SUMMA – сумма, при которой завершается игра.
Нумерация колонок и строк таблице начинается с 0.
Если в ячейке таблицы t[x][y] записано число 2, то это означает, что если в начале игры в первой куче
было Х камней, а во второй куче было У камней, то Петя гарантированно побеждает на 2 ходу.
Если в ячейке таблицы t[x][y] записано число -3, то это означает, что если в начале игры в первой куче
было Х камней, а во второй куче было У камней, то Ваня гарантированно побеждает на 3 ходу.
Таблица большая, т.к. разбираются все возможные ходы и есть ходы типа (1; 76) -> (1; 76*2)

8.

1: РЕКУРСИВНОЕ ЗАПОЛНЕНИЕ ТАБЛИЦЫ
Перебираем все возможные сочетания из Х камней в первой куче и У
камней во второй куче. Сумма Х и У не может быть больше 76 (это конец
игры). Начинаем перебирать с конца:
for x in range(SUMMA-1, 0, -1):
for y in range(SUMMA-x-1, 0, -1):
….
Почему перебор начинается именно с конца, мы разбирать не будем:
это нужно для того, чтобы задачу можно было решить рекурсивно.
Изменять порядок перебора нельзя.

9.

1: РЕКУРСИВНОЕ ЗАПОЛНЕНИЕ ТАБЛИЦЫ
Внутри цикла в отдельную переменную сохраним все возможные
ходы Пети:
for x in range(SUMMA-1, 0, -1):
for y in range(SUMMA-x-1, 0, -1):
PetyaHod = [ t[x+1][y], t[2*x][y], t[x][y+1], t[x][2*y] ]

10.

1: РЕКУРСИВНОЕ ЗАПОЛНЕНИЕ ТАБЛИЦЫ
Если в таблице в t[x][y] стоит положительное число, это значит, что при таких Х и У Петя
побеждает. Но в нашем случае Х и У – это числа не ДО Петиного хода, это числа в ПОСЛЕ
Петиного хода, т.е. это начальные условия для Вани. Поэтому если в PetyaHod
оказывается положительное число, Петя не выигрывает, а, наоборот, проигрывает! Петя
будет выигрывать, если в PetyaHod оказалось отрицательное число. Нули тоже считаем
выигрышными для Пети (красивого объяснения здесь нет, это нужно, чтобы таблицу
можно было рекурсивно заполнить):
for x in range(SUMMA-1, 0, -1):
for y in range(SUMMA-x-1, 0, -1):
PetyaHod = [ t[x+1][y], t[2*x][y], t[x][y+1], t[x][2*y] ]
PetyaWin = [V for V in PetyaHod if V <= 0] # выбираем отрицательные числа из PetyaHod

11.

1: РЕКУРСИВНОЕ ЗАПОЛНЕНИЕ ТАБЛИЦЫ
Программа ищет наиболее оптимальные стратегии и для Пети, и для Вани, поэтому если Петя
может выиграть, он будет стараться выиграть и сделать это за наименьшее количество ходов.
Это значит, что он возьмёт самое маленькое отрицательное число из Ваниного результата
(отрицательное – значит, Ваня проиграл, маленькое – значит, проиграл за маленькое число
ходов).
…. # продолжение программы с предыдущего слайда
if PetyaWin:
t[x][y] = -max(PetyaWin) + 1
Если Ваня проиграл за N ходов, то Петя выиграл за N + 1 ход, поэтому к ответу добавляем
единицу. Минус нам нужен, т.к. Ванин проигрыш (для Вани обозначается отрицательным
числом) это Петин выигрыш (для Пети обозначается положительным числом).

12.

1: РЕКУРСИВНОЕ ЗАПОЛНЕНИЕ ТАБЛИЦЫ
Если Петя не может победить, значит, побеждает Ваня. Программа будет играть за Петю
наиболее оптимальным образом (т.е. Петя будет стараться максимально растянуть игру,
надеясь на ошибку противника). Если Ваня победил за N ходов, то Петя проиграл тоже за N
ходов, поэтому:
…. # продолжение программы
if PetyaWin:
t[x][y] = -max(PetyaWin) + 1
else:
t[x][y] = -max(PetyaHod)
Берём максимальное положительное число из PetyaHod, т.к. Петя будет вести максимально
длинную игру при проигрыше, берём со знаком минус, т.к. при безошибочной игре Вани Петя
проигрывает.

13.

1: ВЫВОД ОТВЕТА
…. # продолжение программы
x = 7 # в первой куче 7 камней
for y in range(1, SUMMA-x, 1):
if t[x][y] == 2: # Петя победил на втором ходе
print(y) # выводим начальное количество камней во 2-й куче
Программа выводит всего 2 значения: 31 и 34. В условии просили найти два значения S, при
которых Петя выигрывает вторым своим ходом, но не может выиграть первым. Это значит,
что в данном случае значения 31 и 34 можно не перепроверять: других вариантов у нас всё
равно нет.
Ответ: 31 34

14.

1: ВСЯ ПРОГРАММА (20-Е ЗАДАНИЕ)
SUMMA = 77 # сумма, необходимая для выигрыша
t = [ [0]*2*SUMMA for i in range(2*SUMMA) ]
for x in range(SUMMA-1, 0, -1):
for y in range(SUMMA-x-1, 0, -1):
PetyaHod = [ t[x+1][y], t[2*x][y], t[x][y+1], t[x][2*y] ] # возможные ходы из текущей позиции
PetyaWin = [V for V in PetyaHod if V <= 0]
if PetyaWin:
t[x][y] = -max(PetyaWin) + 1
else:
t[x][y] = -max(PetyaHod)
x = 7 # в первой куче 7 камней
for y in range(1, SUMMA-x, 1):
if t[x][y] == 2: # Петя победил на втором ходе
print(y)

15.

1: РЕШЕНИЕ 21-ГО ЗАДАНИЯ
Т.к. программа играет оптимально и за Ваню, и за Петю, то чтобы найти значения S, при которых Ваня
выигрывает 2-м ходом, достаточно поменять условие в выводе:
…. # продолжение программы
x = 7 # в первой куче 7 камней
for y in range(1, SUMMA-x, 1):
if t[x][y] == -2: # Ваня победил на втором ходу
print(y) # выводим начальное количество камней во 2-й куче
Программа выводит числа 30 и 33. Минимальное число – 30, но нужно проверить, что в таком случае есть
какой-то Петин ход, позволяющий выиграть Ване за 1 ход.
Проверяем: (7, 30) -> (7, 60) -> (7, 120). Если Петя первым своим ходом умножит количество камней во 2-й куче
в 2 раза, Ваня выиграет за 1 ход. Значение 30 подходит в качестве ответа. Ответ: 30
Готовая программа находится на следующем слайде.

16.

1: РЕШЕНИЕ 21-ГО ЗАДАНИЯ
SUMMA = 77 # сумма, необходимая для выигрыша
t = [ [0]*2*SUMMA for i in range(2*SUMMA) ]
for x in range(SUMMA-1, 0, -1):
for y in range(SUMMA-x-1, 0, -1):
PetyaHod = [ t[x+1][y], t[2*x][y], t[x][y+1], t[x][2*y] ] # возможные ходы из текущей позиции
PetyaWin = [V for V in PetyaHod if V <= 0]
if PetyaWin:
t[x][y] = -max(PetyaWin) + 1
else:
t[x][y] = -max(PetyaHod)
x = 7 # в первой куче 7 камней
for y in range(1, SUMMA-x, 1):
if t[x][y] == -2: # Ваня победил на втором ходе (изменения только здесь)
print(y)

17.

1: РЕШЕНИЕ 19-ГО ЗАДАНИЯ
Программа для 20 и 21 задания не совсем подходит для решения 19-го задания, т.к. в
ней Петя должен играть с ошибкой. Чтобы найти ответ, программу можно немного
изменить: оставить таблицу t с правильными решениями и добавить таблицу d для
вычисления результатов при неправильном ходе Пети.
SUMMA = 77
t = [ [0]*2*SUMMA for i in range(2*SUMMA) ] # таблица ОПТИМАЛЬНОЙ игры Пети
d = [ [0]*2*SUMMA for i in range(2*SUMMA) ] # таблица для игры Пети с ошибкой

18.

1: РЕШЕНИЕ 19-ГО ЗАДАНИЯ
После заполнения таблицы t добавляем кусок кода, который заполняет таблицу d. В таблице d
Ваня должен выигрывать за 1 ход, а Петя должен проигрывать за 1 ход:
# СТРОИМ ТАБЛИЦУ, В КОТОРОЙ ПЕТЯ ДОПУСКАЕТ ОШИБКУ И ПРОИГРЫВАЕТ ЗА 1 ХОД
for x in range(SUMMA-1, 0, -1):
for y in range(SUMMA-x-1, 0, -1):
PetyaHod = [ t[x+1][y], t[2*x][y], t[x][y+1], t[x][2*y] ]
PetyaLose = [V for V in PetyaHod if V == 1] # Ваня выигрывает за 1 ход
if PetyaLose:
d[x][y] = -1 # Петя проигрывает за 1 ход
Остальные варианты нас просто не интересуют, поэтому мы их не заполняем.

19.

1: РЕШЕНИЕ 19-ГО ЗАДАНИЯ
Результат выводим, естественно, для таблицы d:
# ВЫВОД ОТВЕТА
x = 7 # в первой куче 7 камней
for y in range(1, SUMMA-x, 1):
if d[x][y] == -1: # Ваня выигрывает за 1 ход после Петиной ошибки
print(y)
Вывод программы: числа 18, 19, 20, 21 … Минимальное число – 18. Ответ: 18
Готовая программа находится на следующем слайде.

20.

1: РЕШЕНИЕ 19-ГО ЗАДАНИЯ
SUMMA = 77
t = [ [0]*2*SUMMA for i in range(2*SUMMA) ] # таблица ОПТИМАЛЬНОЙ игры Пети
d = [ [0]*2*SUMMA for i in range(2*SUMMA) ] # таблица для игры Пети с ошибкой
# СТРОИМ ТАБЛИЦУ, В КОТОРОЙ ПЕТЯ НЕ ДОПУСКАЕТ ОШИБОК
for x in range(SUMMA-1, 0, -1):
# х — количество камней в первой куче
for y in range(SUMMA-x-1, 0, -1):
# y — количество камней во второй куче
PetyaHod = [ t[x+1][y], t[2*x][y], t[x][y+1], t[x][2*y] ] # возможные ходы из текущей позиции
PetyaWin = [c for c in PetyaHod if c <= 0]
if PetyaWin:
# если Петя может выиграть, он будет стараться выиграть
t[x][y] = -max(PetyaWin) + 1
else:
# если Петя проигрывает
t[x][y] = -max(PetyaHod)
# СТРОИМ ТАБЛИЦУ, В КОТОРОЙ ПЕТЯ ДОПУСКАЕТ ОШИБКУ И ПРОИГРЫВАЕТ ЗА 1 ХОД
for x in range(SUMMA-1, 0, -1):
# х — количество камней в первой куче
for y in range(SUMMA-x-1, 0, -1):
# y — количество камней во второй куче
PetyaHod = [ t[x+1][y], t[2*x][y], t[x][y+1], t[x][2*y] ] # возможные ходы из текущей позиции
PetyaLose = [V for V in PetyaHod if V == 1] # Ваня выигрывает за 1 ход
if PetyaLose:
# если Петя может проиграть Ване за 1 ход, он должен проиграть
d[x][y] = -1
# Петя проигрывает
# ВЫВОД ОТВЕТА
x = 7 # в первой куче 7 камней
for y in range(1, SUMMA-x, 1):
if d[x][y] == -1: # Ваня выигрывает за 1 ход после Петиной ошибки
print(y, d[x][y])

21.

1: О ПОСТРОЕНИИ ТАБЛИЦЫ t
Если Вы запускаете программу в IDLE, то t у Вас сохраняется после первого решения
(20-го задания) и перестраивать t не нужно. Тогда при решении 21-го и 19-го заданий
t можно не строить заново. Т.е. если Вы уже решили 20-е задание, для решения 21-го
достаточно запустить только код для вывода ответа:
x = 7 # в первой куче 7 камней
for y in range(1, SUMMA-x, 1):
if t[x][y] == -2: # Ваня победил на втором ходе (изменения только здесь)
print(y)

22.

1: О ПОСТРОЕНИИ ТАБЛИЦЫ t
Программа для решения 19-го задания при построенной таблице t:
d = [ [0]*2*SUMMA for i in range(2*SUMMA) ] # таблица для игры Пети с ошибкой
# СТРОИМ ТАБЛИЦУ, В КОТОРОЙ ПЕТЯ ДОПУСКАЕТ ОШИБКУ И ПРОИГРЫВАЕТ ЗА 1 ХОД
for x in range(SUMMA-1, 0, -1):
for y in range(SUMMA-x-1, 0, -1):
PetyaHod = [ t[x+1][y], t[2*x][y], t[x][y+1], t[x][2*y] ] # возможные ходы из текущей позиции
PetyaLose = [V for V in PetyaHod if V == 1]
if PetyaLose:
d[x][y] = -1
# ВЫВОД ОТВЕТА
x = 7 # в первой куче 7 камней
for y in range(1, SUMMA-x, 1):
if d[x][y] == -1: # Ваня

23.

1: ИТОГ
Даже если Вы не до конца понимаете отдельные участки кода (например, строчку
создания таблицы t), эти отдельные строчки всегда можно выучить. Смотрите сами,
что Вам проще: выучить наизусть несколько строчек кода (но написать их на экзамене
нужно будет без единой ошибки) или решить задачу математически.
Код программ для заданий 19-21 находится в курсе в файле «Пример 19-21.txt».

24.

ТИП 2: КОЛИЧЕСТВО
КАМНЕЙ В КУЧАХ
УМЕНЬШАЕТСЯ

25.

2: УСЛОВИЕ
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя.
За один ход игрок может убрать из одной из куч один камень или уменьшить количество камней в куче в два раза (если количество камней в
куче нечётно, остаётся на 1 камень больше, чем убирается). Игра завершается в тот момент, когда суммарное количество камней в кучах
становится не более 40. Победителем считается игрок, сделавший последний ход, то есть первым получивший позицию, в которой в кучах будет
40 или меньше камней. В начальный момент в первой куче было 20 камней, во второй куче — S камней, S > 20.
Задание 19.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите максимальное значение S, когда такая ситуация
возможна.
Задание 20.
Найдите три наименьших значения S, при которых у Пети есть выигрышная стратегия, причём одновременно выполняются два условия:
— Петя не может выиграть за один ход;
— Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.
Найденные значения запишите в ответе в порядке возрастания без разделительных знаков.
Задание 21
Найдите максимальное значение S, при котором одновременно выполняются два условия:
— у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
— у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

26.

2: ИЗМЕНЕНИЕ ПРОГРАММЫ ПОД 2-Й ТИП
Для того, чтобы рекурсивно заполнить таблицу при уменьшении количества камней в кучах, требуется:
1) определиться с максимальным размером таблицы (теперь мы сверху не ограничены)
2) понять, как запустить циклы в обратном порядке;
3) понять, как изменить формулы (в вычислении следующего хода).
Максимальный размер возьмём таким: SUMMA * 16. Такой размер таблицы позволяет вычислить игру
минимум в 4 хода.
SUMMA = 40
MAXS = 16*SUMMA
t = [ [0]*MAXS for i in range(MAXS) ]
Максимальный размер таблицы во всех задачах на уменьшение берём хотя бы 16*SUMMA.

27.

2: ИЗМЕНЕНИЕ ПРОГРАММЫ ПОД 2-Й ТИП
Запуск циклов в обратном порядке:
# СТРОИМ ТАБЛИЦУ ИГРЫ
for x in range(1, MAXS, 1):
for y in range(max(SUMMA-x+1, 1), MAXS, 1):
…..
# ВЫВОД ОТВЕТА
x = 20
for y in range(max(SUMMA-x+1, 1), MAXS, 1):
….
Если не очень понятно, почему нужно именно так запустить циклы, остаётся одно: зазубрить эти три
строчки кода.

28.

2: ИЗМЕНЕНИЕ ПРОГРАММЫ ПОД 2-Й ТИП
Теперь изменим формулы в PetyaHod.
Убрать камень из одной кучи легко:
PetyaHod = [ t[x-1][y], t[ ??? ][y], t[x][y-1], t[x][ ??? ] ]
Теперь уменьшим количество камней в куче в 2 раза, причём если камней – нечётное
количество, лишний камень заберём:
PetyaHod = [ t[x-1][y], t[ x//2 ][y], t[x][y-1], t[x][ y//2 ] ]
Но по условию ведь нам нельзя забирать лишний камень, он должен остаться в куче, поэтому:
PetyaHod = [ t[x-1][y], t[x//2 + x%2][y], t[x][y-1], t[x][y//2 + y%2] ]

29.

2: ИЗМЕНЕНИЕ ПРОГРАММЫ ПОД 2-Й ТИП
Всё. Больше никаких изменений нет.
Программы для решения заданий 20, 21 и 19 на следующих
слайдах.

30.

2: ВСЯ ПРОГРАММА (20-Е ЗАДАНИЕ)
SUMMA = 40 # минимальное количество камней
MAXS = 16*SUMMA # берём хотя бы 16
t = [ [0]*MAXS for i in range(MAXS) ]
# СТРОИМ ТАБЛИЦУ БЕЗОШИБОЧНОЙ ИГРЫ
for x in range(1, MAXS, 1):
for y in range(max(SUMMA-x+1, 1), MAXS, 1):
PetyaHod = [ t[x-1][y], t[x//2 + x%2][y], t[x][y-1], t[x][y//2 + y%2] ]
PetyaWin = [V for V in PetyaHod if V <= 0]
if PetyaWin:
t[x][y] = -max(PetyaWin) + 1
else:
t[x][y] = -max(PetyaHod)
# ВЫВОД ОТВЕТА ДЛЯ 20-ГО ЗАДАНИЯ
x = 20
for y in range(max(SUMMA-x+1, 1), MAXS, 1):
if t[x][y] == 2: # Петя выигрывает в 2 хода
print(y)
Программа выводит числа 42, 43, 61, 81, 82.
Вывод программы нужно перепроверить (что
Петя не может выиграть за 1 ход).
После перепроверки оказывается, что первые
три наименьших значения (42, 43, 61)
подходят.
Ответ: 42 43 61

31.

2: ВСЯ ПРОГРАММА (21-Е ЗАДАНИЕ)
SUMMA = 40 # минимальное количество камней
MAXS = 16*SUMMA # берём хотя бы 16
t = [ [0]*MAXS for i in range(MAXS) ]
# СТРОИМ ТАБЛИЦУ БЕЗОШИБОЧНОЙ ИГРЫ
for x in range(1, MAXS, 1):
for y in range(max(SUMMA-x+1, 1), MAXS, 1):
PetyaHod = [ t[x-1][y], t[x//2 + x%2][y], t[x][y-1], t[x][y//2 + y%2] ]
PetyaWin = [V for V in PetyaHod if V <= 0]
if PetyaWin:
t[x][y] = -max(PetyaWin) + 1
else:
t[x][y] = -max(PetyaHod)
# ВЫВОД ОТВЕТА ДЛЯ 21-ГО ЗАДАНИЯ
x = 20
for y in range(max(SUMMA-x+1, 1), MAXS, 1):
if t[x][y] == -2: # Ваня выигрывает в 2 хода
print(y)
Программа выводит единственное число — 44.
Ничего перепроверять не будем, всё равно
других вариантов нет.
Ответ: 44

32.

2: ВСЯ ПРОГРАММА (19-Е ЗАДАНИЕ)
SUMMA = 40 # минимальное количество камней
MAXS = 16*SUMMA # берём хотя бы 16
t = [ [0]*MAXS for i in range(MAXS) ]
# СТРОИМ ТАБЛИЦУ БЕЗОШИБОЧНОЙ ИГРЫ
for x in range(1, MAXS, 1):
for y in range(max(SUMMA-x+1, 1), MAXS, 1):
PetyaHod = [ t[x-1][y], t[x//2 + x%2][y], t[x][y-1], t[x][y//2 + y%2] ]
PetyaWin = [V for V in PetyaHod if V <= 0]
if PetyaWin:
t[x][y] = -max(PetyaWin) + 1
else:
t[x][y] = -max(PetyaHod)
# РЕШЕНИЕ 19-ГО ЗАДАНИЯ
d = [ [0]*MAXS for i in range(MAXS) ]
# СТРОИМ ТАБЛИЦУ, В КОТОРОЙ ПЕТЯ ДОПУСКАЕТ ОШИБКУ И ПРОИГРЫВАЕТ ЗА 1 ХОД
for x in range(1, MAXS, 1):
for y in range(max(SUMMA-x+1, 1), MAXS, 1):
PetyaHod = [ t[x-1][y], t[x//2 + x%2][y], t[x][y-1], t[x][y//2 + y%2] ]
PetyaLose = [V for V in PetyaHod if V == 1]
if PetyaLose:
d[x][y] = -1
# ВЫВОД ОТВЕТА ДЛЯ 19-ГО ЗАДАНИЯ
x = 20
for y in range(max(SUMMA-x+1, 1), MAXS, 1):
if d[x][y] == -1: # Ваня выигрывает за 1 ход после Петиной ошибки
print(y)
Программа выводит много чисел: 22, 23, 24 …
78, 79, 80. Максимальное — 80.
Ответ: 80

В задание №19_20_21

Тема: Теория игр. Поиск выигрышной стратегии.

Проверяется умение анализировать алгоритм логической игры. Умение найти выигрышную стратегию игры. Умение построить дерево игры по заданному алгоритму и найти выигрышную стратегию.



  • Одна куча — варианты решений



  • Две кучи — варианты решений



  • Три кучи — варианты решений

Немного теории:

☆ Все позиции в простых играх делятся на выигрышные и проигрышные

  • выигрышная позиция – это такая позиция, в которой игрок, делающий первый ход, может гарантированно выиграть при любой игре соперника, если не сделает ошибку; при этом говорят, что у него есть выигрышная стратегия – алгоритм выбора очередного хода, позволяющий ему выиграть
  • если игрок начинает играть в проигрышной позиции, он обязательно проиграет, если ошибку не сделает его соперник; в этом случае говорят, что у него нет выигрышной стратегии; таким образом, общая стратегия игры состоит в том, чтобы своим ходом создать проигрышную позицию для соперника
  • выигрышные и проигрышные позиции можно охарактеризовать так:
    • позиция, из которой все возможные ходы ведут в выигрышные позиции – проигрышная;
    • позиция, из которой хотя бы один из возможных ходов ведет в проигрышную позицию — выигрышная, при этом стратегия игрока состоит в том, чтобы перевести игру в эту проигрышную (для соперника) позицию.

Одна куча:

Задание 19

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

  1. Добавить в кучу один камень или
  2. Добавить в кучу три камня или
  3. Увеличить количество камней в куче в четыре раза.

Например, имея кучу из 20 камней, за одни ход можно получить кучу из 21, 23 или 80 камней. У каждого игрока, чтобы делать ходы, есть неограниченное количество камней.

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

Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретится при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т.е. не являющиеся выигрышными независимо от игры противника.

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

Решение:

Ответ: 5

Задание 20

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

  • Петя не может выиграть за один ход;
  • Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.

Найденные значения запишите в ответе в порядке возрастания.

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

Ответ: 16 18

Задание 21

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

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

Ответ: 15

Задание 19 (самостоятельно)

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

  1. Добавить в кучу один камень или
  2. Добавить в кучу два камня или
  3. Увеличить количество камней в куче в четыре раза.

Например, имея кучу из 20 камней, за одни ход можно получить кучу из 21, 22 или 79 камней. У каждого игрока, чтобы делать ходы, есть неограниченное количество камней.

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

Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретится при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т.е. не являющиеся выигрышными независимо от игры противника.

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

Задание 20 (самостоятельно)

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

  • Петя не может выиграть за один ход;
  • Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.

Найденные значения запишите в ответе в порядке возрастания.

Задание 21 (самостоятельно)

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

  • У Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
  • У Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Задание 19_20_22(DEMO) пишем программу Phyton

P-01 (демо-2022). Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит

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

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

Задание 19.

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

Задание 20.

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

− Петя не может выиграть за один ход;

− Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.

Найденные значения запишите в ответе в порядке возрастания.

Задание 21

Найдите значение S, при котором одновременно выполняются два условия:

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

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

n = 29
def gameResult(s):
    if s>=n:return 0 
    nYes = [gameResult(s+1), gameResult(s*2)] 
    nNo = [i for i in nYes if i<=0] 
    if nNo:res = -max(nNo) + 1
    else:res = -max(nYes)
    return res

# основная программа
results = [(s,gameResult(s)) for s in range(1,n)]
print( '19:', [s for s, r in results if r == -1] )
print( '20:', [s for s, r in results if r == 2] )
print( '21:', [s for s, r in results if r == -2] )

Задание 19_20_22 (Поляков) пишем программу Phyton

Две кучи — варианты решений

Задание 19 (разбираем задание)

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

  1. Добавить в одну из куч (по своему выбору) один камень или
  2. Добавить в одну из куч (по своему выбору) удвоенное число камне из другой кучи.

Например, пусть в одной куче 8 камней, а в другой куче 5 камней. Тогда за один ход можем получить четыре позиции: (9, 5); (18, 5); (8, 6); (8, 21).

Для того что бы играть, у игроков есть неограниченное количество камне.

Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 77. Победителем считается игрок, сделавший последний ход, т.е. первым получивший такую позицию, при которой в кучах будет 77 или больше камней.

В начальный момент в первой куче было 9 камней, во второй S камней: 1 ≤ S ≤ 67.

Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретится при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т.е. не являющиеся выигрышными независимо от игры противника.

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

Можно решить с помощью рассуждений:

  • Если S = 67, то добавив в любую кучу один камень (67+1+9=77), или добавить удвоенную соседнюю кучу в любую из куч (9+(67+2*9)=94 или ((9+2*67)+67=210), Петя становится победителем.
  • Если S = 66, добавив удвоенную соседнюю кучу в любую из куч (9+(66+2*9)=93 или ((9+2*66)+66=207), Петя становится победителем.
  • Если S = 65, добавив удвоенную соседнюю кучу в любую из куч (9+(65+2*9)=92 или ((9+2*65)+65=204), Петя становится победителем.
  • Обратим внимание, если удваиваем 9 камней и добавляем во вторую кучу, уменьшение ровно на 1, поэтому ускорим процесс 92-77=15, 65 -15 =50, идем дальше
  • Если S = 50, добавив удвоенную соседнюю кучу в любую из куч (9+(50+2*9)=77 или ((9+2*50)+50=159), Петя становится победителем.
  • У нас остается только один вариант, ускорим процес, усли удваиваем вторую кучу, уменьшение ровно на три, поэтому ускорим процесс 159-77=82, 82/3=27,333, 50-27=23
  • Если S = 23, добавив удвоенную соседнюю кучу в эту из куч ((9+2*23)+23=78), Петя становится победителем. СТОП!!!

Получили – S>=23 – это ВЫИГРЫШНАЯ ПОЗИЦИЯ,

S<23 будет ПРОИГРЫШНОЙ ПОЗИЦИЕЙ ДЛЯ ЛЮБОГО ИГРОКА.

Известно, что Вася выиграл своим первым ходом, после НЕУДАЧНОГО первого хода Пети.

Неудачный ход – это значит Петя увеличил количество камне увеличив одну из куч удвоенным количеством соседней кучи. Получаем S+2*9 = 23 => S=5

Можно проверить программой:

# 19-----------------------------------
def f(x, y, p):
    if x + y >=77 and p == 3: return True
    else:
        if x + y < 77 and p == 3:return False
    return f(x+1, y, p+1) or f(x, y+1, p+1) or f(x+2*y, y, p+1) or f(x, y+2*x, p+1)

# начинаем перебор для 19 задания
print('19 ответ -', end=' ')
for i in range(1,50+1):
    if f(9, i, 1):
        print(i)
        break

Ответ: 5

Задание 20 (разбираем задание)

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

  • Петя не может выиграть за один ход;
  • Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.

Найденные значения запишите в ответе в порядке возрастания.

Ответ: 7 22

Задание 21 (разбираем задание)

Найдите значение S, при котором одновременно выполняются два условия:

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

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

Ответ: 21

Три кучи — варианты решений

Задание 19_20_21 (разбираем задание)

(№ 4725) (И. Осипов) Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат три кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч (по своему выбору) три камня или увеличить количество камней в куче в два раза. Например, пусть в первой куче 10 камней, во второй 7, а в третьей 4 камня; такую позицию в игре будем обозначать (10, 7, 4). Тогда за один ход можно получить любую из шести позиций: (13, 7, 4), (20, 7, 4), (10, 10, 4), (10, 14, 4), (10, 7, 7), (10, 7, 8). Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней. Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 71. Победителем считается игрок, сделавший последний ход, т. е. первым получивший такую позицию, что в кучах всего будет 71 или больше камней. В начальный момент в первой куче было семь камней, во второй куче пять камней, в третьей куче – S камней; 1 ≤ S ≤ 58.
Ответьте на следующие вопросы:
  Вопрос 1.При некотором значении S Ваня одержал победу свои первым ходом после неудачного хода Пети. Укажите минимальное значение S, при котором это возможно.
  Вопрос 2. Найдите минимальное и максимальное значения S, при которых Петя выигрывает вторым ходом при любом ходе Вани.
  Вопрос 3. Найдите значение S, при котором одновременно выполняются два условия: а) у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети; б) у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

# --19----------------
def f(x,y,z,p):
    if x + y + z >=71 and p == 3:return True
    else:
        if x + y + z < 71 and p == 3:return False
    return (f(x+3, y, z, p+1) or f(x*2, y, z, p+1) or f(x, y+3, z, p+1) or
            f(x, y*2, z, p+1) or f(x, y, z+3, p+1) or f(x, y, z*2, p+1))
# ------------------------
print('19 ответ:', end=' ')
for i in range(1,58+1):
    if f(7, 5, i, 1):
        print(i)
        break

Ответ: 15

# --20----------------
def f(x,y,z,p):
    if x + y + z >=71 and p == 4:return True
    else:
        if x + y + z < 71 and p == 4:return False
        else:
            if x + y + z>=71:return False
    if p % 2 == 1:
        return (f(x+3, y, z, p+1) or f(x*2, y, z, p+1) or f(x, y+3, z, p+1) or
        f(x, y*2, z, p+1) or f(x, y, z+3, p+1) or f(x, y, z*2, p+1))
    else:
        return (f(x+3, y, z, p+1) and f(x*2, y, z, p+1) and f(x, y+3, z, p+1)
        and f(x, y*2, z, p+1) and f(x, y, z+3, p+1) and f(x, y, z*2, p+1))
# ------------------------
print('20 ответ:', end=' ')
for i in range(1,58+1):
    if f(7, 5, i, 1):
        print(i, end=' ')

Ответ: 14 27

# --21----------------
print()
def f(x,y,z,p):
    if x + y + z >=71 and (p == 3 or p == 5):return True
    else:
        if x + y + z < 71 and p == 5:return False
        else:
            if x + y + z>=71:return False
    if p % 2 == 0:
        return (f(x+3, y, z, p+1) or f(x*2, y, z, p+1) or f(x, y+3, z, p+1) or
        f(x, y*2, z, p+1) or f(x, y, z+3, p+1) or f(x, y, z*2, p+1))
    else:
        return (f(x+3, y, z, p+1) and f(x*2, y, z, p+1) and f(x, y+3, z, p+1)
        and f(x, y*2, z, p+1) and f(x, y, z+3, p+1) and f(x, y, z*2, p+1))
# ------------------------
print('21 ответ:', end=' ')
for i in range(1,58+1):
    if f(7, 5, i, 1):
        print(i, end=' ')
        break

Ответ: 24

Понравилась статья? Поделить с друзьями:
  • Решение задания номер 3 по информатике егэ
  • Решение задания 7 егэ информатика звук
  • Решение задания 6 егэ информатика 2023 на кумире
  • Решение задания 15 егэ информатика онлайн
  • Решение задания 12 егэ информатика на паскале