Статья Автор: Лебедев Дмитрий

Разбор варианта Статграда от 24 октября 2024 года. Часть 4 (18)

Задание 18 (ссылка на задание)

Робот стоит в левом верхнем углу прямоугольного поля, в каждой клетке которого записано целое число. В некоторых клетках записано число –1, в эти клетки роботу заходить нельзя. Для вашего удобства такие клетки выделены тёмным фоном. В остальных клетках записаны положительные числа. За один ход робот может переместиться на одну клетку вправо или на одну клетку вниз.
Клетка, из которой робот не может сделать допустимого хода (справа и снизу находятся границы поля или запрещённые клетки), называется финальной. На поле может быть несколько финальных клеток. В начальный момент робот обладает некоторым запасом энергии. Расход энергии на запуск робота равен числу, записанному в стартовой клетке. В дальнейшем расход энергии на переход в каждую следующую клетку равен числу, записанному в этой клетке.

Задание 1. Определите минимальный начальный запас энергии, который позволит роботу добраться до любой финальной клетки.
Задание 2. Определите минимальный начальный запас энергии, который позволит роботу пройти любым допустимым маршрутом.


Обычно файл с данными имеет форматирование (стенки), которое затрудняет программное решение задания.
В этом задании форматирование отсутствует, а "препятствия" заданы значениями ячеек.
Это позволяте методом  "copy-paste" (аналогично заданию типа 9) быстро получить данные в текстовом файле.
Таблица с данными представлены в файлах "18_24-10.xlsx" и "18_24-10.txt".
Разберем "программный" способ решения. При решении будем использовать принципы динамического программирования и структуру данных словарь (аналогично заданиям типа 16, 19-20-21, 23)
Примечание. Решение использует тот факт, что все ячейки с положительными значениями "достижимы" из стартовой точки.

Первый этап - Подготовительный
Данные таблицы НЕ БУДЕМ хранить в двумерном списке, а заполним ими словарь Tabl.
В словарь Tabl запишем только "разрешенные" клетки (с неотрицательными значениями)
Определим N - число строк таблицы и M - число столбцов.
 


По условию, есть одна "стартовая" точка и несколько "финальных". 
Для решения удобно применить метод "сверху-вниз" с запуском от всех "финальных" позиций.
Определим "финальные" позиции с помощью подпрограммы isnext(pos)


Определение максимальных сумм.
Напишем программу, осуществляющую "динамическую рекурсию" методом "сверху вниз" с поиском максимальной  и минимальной сумм пути.
Для этого будем
  • использовать "обратные" команды (влево заменяет вправо, ввниз заменяет вверх)
  • значения будем записывать в словарь Dpmax и Dpmin
  • полученные результаты добавим в  End_pos
Программы поиска максимального и минимального пути - программы-близнецы, поэтому одну убрали

Прикрепленные файлы
18_24-10.txt
18_24-10.xlsx
Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать