
Робот в электронных таблицах
Штана Альберт Игоревич
В этой статье будет разобрано задание 18.
Рассмотрим задачи последних лет из демоверсий ЕГЭ по информатике.
Данное задание относится к повышенному уровню сложности.
Время выполнения задания ≈ 8 минут.
Данное задание выполняется в одном из приложенных файлов(.ods, .xls, .xlsx) с помощью электронной таблицы. Краткий конспект по обработке информации в электронной таблице по ссылке:
Ссылка на статью: Обработка информации в электронных таблицах.
Квадрат разлинован на N × N клеток (1 < N < 30). Исполнитель Робот может перемещаться по клеткам, выполняя за одно перемещение одну из двух команд: вправо или вниз. По команде вправо Робот перемещается в соседнюю правую клетку, по команде вниз – в соседнюю нижнюю. Квадрат ограничен внешними стенами. Между соседними клетками квадрата также могут быть внутренние стены. Сквозь стену Робот пройти не может. Перед каждым запуском Робота в каждой клетке квадрата лежит монета достоинством от 1 до 100. Посетив клетку, Робот забирает монету с собой; Это также относится к начальной и конечной клеткам маршрута Робота. В «угловых» клетках поля – тех, которые справа и снизу ограничены стенами, Робот не может продолжать движение, поэтому накопленная сумма считается итоговой. Таких конечных клеток на поле может быть несколько, включая правую нижнюю клетку поля. При разных запусках итоговые накопленные суммы могут различаться.
Определите максимальную и минимальную денежные суммы, среди всех возможных итоговых сумм, которые может собрать Робот, пройдя из левой верхней клетки в конечную клетку маршрута. В ответе укажите два числа – сначала максимальную сумму, затем минимальную.
Исходные данные представляют собой электронную таблицу размером N × N, каждая ячейка которой соответствует клетке квадрата. Внутренние и внешние стены обозначены утолщёнными линиями.
Итоговая клетка - это клетка, когда роботу больше некуда ходить.
Полное видео решение с комментариями:
Для работы с кодом предварительно нужно создать файл с данными расширением 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
Квадрат разлинован на N × N клеток (1 < N < 30). Исполнитель Робот может перемещаться по клеткам, выполняя за одно перемещение одну из двух команд: вправо или вниз. По команде вправо Робот перемещается в соседнюю правую клетку, по команде вниз – в соседнюю нижнюю. Квадрат ограничен внешними стенами. Между соседними клетками квадрата также могут быть внутренние стены. Сквозь стену Робот пройти не может. Перед каждым запуском Робота в каждой клетке квадрата лежит монета достоинством от 1 до 100. Посетив клетку, Робот забирает монету с собой; Это также относится к начальной и конечной клеткам маршрута Робота. В «угловых» клетках поля – тех, которые справа и снизу ограничены стенами, Робот не может продолжать движение, поэтому накопленная сумма считается итоговой. Таких конечных клеток на поле может быть несколько, включая правую нижнюю клетку поля. При разных запусках итоговые накопленные суммы могут различаться.
Определите максимальную и минимальную денежные суммы, среди всех возможных итоговых сумм, которые может собрать Робот, пройдя из левой верхней клетки в конечную клетку маршрута. В ответе укажите два числа – сначала максимальную сумму, затем минимальную.
Исходные данные представляют собой электронную таблицу размером N × N, каждая ячейка которой соответствует клетке квадрата. Внутренние и внешние стены обозначены утолщёнными линиями.
p.s. Видео разбор подобной задачи был выше в демоверсии 2024. В демоверсии 2025 задание дано аналогичное.
Для работы с кодом предварительно нужно создать файл с данными расширением 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
Описание задачи совпадает со старыми версиями задачи.
Задание: Определите максимальную и минимальную денежные суммы среди всех возможных итоговых сумм, которые может собрать Робот, пройдя из левой верхней клетки в конечную клетку маршрута. В ответе укажите два числа – сначала максимальную сумму, затем минимальную.
Исходные данные представляют собой электронную таблицу размером N × N, каждая ячейка которой соответствует клетке квадрата. Внутренние и внешние стены обозначены утолщёнными линиями.
Данное решение практически ничем не отличается от способов решения аналогичной задачи с разбором по видео выше. Отличия будут только там где у робота стены. Способ решения одинаков. Подробный алгоритм также был прописан выше.
Для работы с кодом предварительно нужно создать файл с данными расширением 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