Все статьи по ЕГЭ
4 сент. 2025 г. - 21 мин. чтения
ЕГЭ Задание 18

ЕГЭ Задание 18

Робот в электронных таблицах

@ashtana

Штана Альберт Игоревич

В этой статье будет разобрано задание 18.

Рассмотрим задачи последних лет из демоверсий ЕГЭ по информатике.

Данное задание относится к повышенному уровню сложности.

Время выполнения задания ≈ 8 минут.

Данное задание выполняется в одном из приложенных файлов(.ods, .xls, .xlsx) с помощью электронной таблицы. Краткий конспект по обработке информации в электронной таблице по ссылке:

Ссылка на статью: Обработка информации в электронных таблицах.

Задача 1 (Демоверсия ЕГЭ 2024 год)

Квадрат разлинован на N × N клеток (1 < N < 30). Исполнитель Робот может перемещаться по клеткам, выполняя за одно перемещение одну из двух команд: вправо или вниз. По команде вправо Робот перемещается в соседнюю правую клетку, по команде вниз – в соседнюю нижнюю. Квадрат ограничен внешними стенами. Между соседними клетками квадрата также могут быть внутренние стены. Сквозь стену Робот пройти не может. Перед каждым запуском Робота в каждой клетке квадрата лежит монета достоинством от 1 до 100. Посетив клетку, Робот забирает монету с собой; Это также относится к начальной и конечной клеткам маршрута Робота. В «угловых» клетках поля – тех, которые справа и снизу ограничены стенами, Робот не может продолжать движение, поэтому накопленная сумма считается итоговой. Таких конечных клеток на поле может быть несколько, включая правую нижнюю клетку поля. При разных запусках итоговые накопленные суммы могут различаться.

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

Исходные данные представляют собой электронную таблицу размером N × N, каждая ячейка которой соответствует клетке квадрата. Внутренние и внешние стены обозначены утолщёнными линиями.

Решение:
Решение с помощью электронной таблицы

Итоговая клетка - это клетка, когда роботу больше некуда ходить.

  1. Выделить все ячейки с числами, нажать "вырезать", используя контекстное меню. Вставим данные на 1 столбец вправо. Это нужно потому, что будем использовать для решения формулу в Excel, которая будет обращаться к ячейке слева.
  2. Мысленно представим пространство на 1 строчку ниже, чем область, где находятся числа. Это пространство будет таким же по размерам, как и область с числами. В этом пространстве и будет наше решение. p.s. Можно скопировать прямоугольник с числами и вставить его снизу, пропустив одну строчку. Потому нажмём кнопку DELETE, тогда числа удаляться, а стенки останутся! И также отметим любым цветом те ячейки, которые "спрятаны" от движения Робота стенками. Определим направление движения робота.
  3. В ячейку откуда робот стартует просто перекопируем значение и далее в соседнюю ячейку от старта(там где может быть следующий ход робота, например у меня получилось в B22 эта ячейка). Пишем формулу: =МАКС(B21;A22)+B1. Здесь МАКС - это функция выбора максимального значения из двух предыдущих откуда робот мог прийти в эту клетку B22, плюс значение из исходных данных сколько монет он соберёт. Затем "растягиванием" распространяем эту формулу по всей таблице, кроме тех ячеек где у робота ограничение движения(стены).
  4. Осталось прописать формулу для сбора монет роботом из клеток с ограничениями движения. Для вертикальных подкрашенных полосок, Робот может попасть только сверху! Поэтому пишем формулу для ячейки, к примеру, для I24: =I23+I3. Аналогично делаем для всех вертикальны подкрашенных полосок. В ячейки для горизонтально подкрашенных полосок, Робот может попасть только слева! Поэтому пишем формулу, к примеру, для ячейки C26: =B26+C5. После этого, итоговые клетки будут претендовать на ответ.
  5. Дополнительно. Чтобы получить минимальную возможную сумму, в главной формуле функцию МАКС нужно заменить на МИН! Удобно воспользоваться автоматической заменой через Ctrl+F.

Полное видео решение с комментариями:

Решение с помощью Python

Для работы с кодом предварительно нужно создать файл с данными расширением txt(ниже на видео я это показываю):

Полное видео решение с комментариями:

# 18_2024.txt должен быть в той же папке с кодом, как его сделать есть видео
with open('18_2024.txt') as file:  # содержать 40 строк(20 данных/20 спец символов)
    money = [list(map(int, file.readline().split())) for _ in range(20)]  # 20 - количество строк с монетами
    # print(*money, sep='\n')
    walls = [file.readline().split() for _ in range(20)]
    # print(*walls, sep='\n')

dync_table = [[999999999] * 20 for _ in range(20)]  # -999999999 изменить на 999999999 если ищем минимальное число
dync_table[0][0] = money[0][0]  # копируем количество монет с левого верхнего угла
answers = []  # создаём список ответов
# начинаем шаги
for i in range(20):  # 20 - количество строк с монетами
    for j in range(20):  # 20 - количество столбцов с монетами
        if 'p' not in walls[i][j]:
            # делаем шаг вправо и выбираем максимум/минимум (max/min)
            dync_table[i][j + 1] = min(dync_table[i][j + 1], dync_table[i][j] + money[i][j + 1])  # min если ищем минимум
        if 'n' not in walls[i][j]:
            # делаем шаг вниз и выбираем максимум/минимум (max/min)
            dync_table[i + 1][j] = min(dync_table[i + 1][j], dync_table[i][j] + money[i + 1][j])  # min если ищем минимум
        # Условие пришли ли мы в финальную клетку т.е. откуда ход далее невозможен:
        if 'np' == walls[i][j]:
            answers.append(dync_table[i][j])  # добавляем суммарные монеты в ответ

# Выводим максимальную сумму монет которую получилось просуммировать выше
print(min(answers))  # заменить на max если ищем максимум

Ответ: 2167 | 718

Задача 2 (Демоверсия ЕГЭ 2025 год)

Квадрат разлинован на N × N клеток (1 < N < 30). Исполнитель Робот может перемещаться по клеткам, выполняя за одно перемещение одну из двух команд: вправо или вниз. По команде вправо Робот перемещается в соседнюю правую клетку, по команде вниз – в соседнюю нижнюю. Квадрат ограничен внешними стенами. Между соседними клетками квадрата также могут быть внутренние стены. Сквозь стену Робот пройти не может. Перед каждым запуском Робота в каждой клетке квадрата лежит монета достоинством от 1 до 100. Посетив клетку, Робот забирает монету с собой; Это также относится к начальной и конечной клеткам маршрута Робота. В «угловых» клетках поля – тех, которые справа и снизу ограничены стенами, Робот не может продолжать движение, поэтому накопленная сумма считается итоговой. Таких конечных клеток на поле может быть несколько, включая правую нижнюю клетку поля. При разных запусках итоговые накопленные суммы могут различаться.

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

Исходные данные представляют собой электронную таблицу размером N × N, каждая ячейка которой соответствует клетке квадрата. Внутренние и внешние стены обозначены утолщёнными линиями.

Решение:
Решение с помощью электронной таблицы

p.s. Видео разбор подобной задачи был выше в демоверсии 2024. В демоверсии 2025 задание дано аналогичное.

  1. Выделить все ячейки с числами, нажать "вырезать", используя контекстное меню. Вставим данные на 1 столбец вправо. Это нужно потому, что будем использовать для решения формулу в Excel, которая будет обращаться к ячейке слева.
  2. Мысленно представим пространство на 1 строчку ниже, чем область, где находятся числа. Это пространство будет таким же по размерам, как и область с числами. В этом пространстве и будет наше решение. Нужно скопировать прямоугольник с числами и вставить его снизу, пропустив одну строчку. Потому нажмём кнопку DELETE, тогда числа удаляться, а стенки останутся! И также отметим любым цветом те ячейки, которые "спрятаны" от движения робота стенками, определив направление движения робота.
  3. В ячейку откуда робот стартует просто перекопируем значение и далее в соседнюю ячейку от старта(там где может быть следующий ход робота, например у меня получилось в B22 эта ячейка справа). Пишем формулу: =МАКС(B21;A22)+B1. Здесь МАКС - это функция выбора максимального значения из двух предыдущих откуда робот мог прийти в эту клетку B22, плюс значение из исходных данных сколько монет он соберёт. Затем "растягиванием" распространяем эту формулу по всей таблице, кроме тех ячеек где у робота ограничение движения(стены).
  4. Осталось прописать формулу для сбора монет роботом из клеток с ограничениями движения. Для вертикальных подкрашенных полосок, Робот может попасть только сверху! Поэтому пишем формулу для ячейки, к примеру, для I24: =I23+I3. Аналогично делаем для всех вертикальны подкрашенных полосок. В ячейки для горизонтально подкрашенных полосок, Робот может попасть только слева! Поэтому пишем формулу, к примеру, для ячейки C26: =B26+C5. После этого, итоговые клетки будут претендовать на ответ.
  5. Чтобы получить минимальную возможную сумму, в главной формуле функцию МАКС нужно заменить на МИН! Удобно воспользоваться автоматической заменой через Ctrl+F. Увидим минимум в одном из углов(если робот в нём оказался то дальше он уже идти никуда не сможет).
Решение на Python

Для работы с кодом предварительно нужно создать файл с данными расширением txt.

# 18_2025.txt должен быть в той же папке с кодом
with open('18_2025.txt') as file:  # содержать 40 строк(20 данных/20 спец символов)
    money = [list(map(int, file.readline().split())) for _ in range(20)]  # 20 - количество строк с монетами
    # print(*money, sep='\n')
    walls = [file.readline().split() for _ in range(20)]
    # print(*walls, sep='\n')

dync_table = [[-999999999] * 20 for _ in range(20)]  # -999999999 изменить на 999999999 если ищем минимальное число
dync_table[0][0] = money[0][0]  # копируем количество монет из левого верхнего угла
answers = []  # создаём список ответов
# начинаем шаги
for i in range(20):  # 20 - количество строк с монетами
    for j in range(20):  # 20 - количество столбцов с монетами
        if 'p' not in walls[i][j]:
            # делаем шаг вправо и выбираем максимум/минимум (max/min)
            dync_table[i][j + 1] = max(dync_table[i][j + 1],
                                       dync_table[i][j] + money[i][j + 1])  # min если ищем минимум
        if 'n' not in walls[i][j]:
            # делаем шаг вниз и выбираем максимум/минимум (max/min)
            dync_table[i + 1][j] = max(dync_table[i + 1][j], dync_table[i][j] + money[i + 1][j])  # min если ищем минимум
        # Условие пришли ли мы в финальную клетку т.е. откуда ход далее невозможен:
        if 'np' == walls[i][j]:
            answers.append(dync_table[i][j])  # добавляем суммарные монеты в ответ

# Выводим максимальную сумму монет которую получилось просуммировать выше
print(max(answers))  # заменить на min если ищем минимум

Ответ: 2671 | 419

Задача 3 (Демоверсия 2026)

Описание задачи совпадает со старыми версиями задачи.

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

Исходные данные представляют собой электронную таблицу размером N × N, каждая ячейка которой соответствует клетке квадрата. Внутренние и внешние стены обозначены утолщёнными линиями.

Решение:
Решение с помощью электронной таблицы

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

Решение на Python

Для работы с кодом предварительно нужно создать файл с данными расширением txt. Видео есть выше как это сделать на примере демоверсии 2024.

# 18_2026.txt должен быть в той же папке с кодом
with open('18_2026.txt') as file:  # содержать 40 строк(20 данных/20 спец символов)
    money = [list(map(int, file.readline().split())) for _ in range(20)]  # 20 - количество строк с монетами
    # print(*money, sep='\n')
    walls = [file.readline().split() for _ in range(20)]
    # print(*walls, sep='\n')

dync_table = [[999999999] * 20 for _ in range(20)]  # 999999999 изменить на -999999999 если ищем максимальное число
dync_table[0][0] = money[0][0]  # копируем количество монет из левого верхнего угла
answers = []  # создаём список ответов
# начинаем шаги
for i in range(20):  # 20 - количество строк с монетами
    for j in range(20):  # 20 - количество столбцов с монетами
        if 'p' not in walls[i][j]:
            # делаем шаг вправо и выбираем максимум/минимум (max/min)
            dync_table[i][j + 1] = min(dync_table[i][j + 1], dync_table[i][j] + money[i][j + 1])  # max если ищем максимум
        if 'n' not in walls[i][j]:
            # делаем шаг вниз и выбираем максимум/минимум (max/min)
            dync_table[i + 1][j] = min(dync_table[i + 1][j], dync_table[i][j] + money[i + 1][j])  # max если ищем максимум
        # Условие пришли ли мы в финальную клетку т.е. откуда ход далее невозможен:
        if 'np' == walls[i][j]:
            answers.append(dync_table[i][j])  # добавляем суммарные монеты в ответ

# Выводим минимальную сумму монет которую получилось просуммировать выше
print(min(answers))  # заменить на max если ищем максимум

Ответ: 2362 | 1205