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

А может быть стоит решать задание типа 18 программно???

Задание типа 18 предполагается решать с помощью табличного редактора. Это в целом правильно yes
Но, после решения задания типа 18 из варианта Статграда, ученик Фома стал требовать решения этого задания с помощью программы.

Условие задания (демоверсия 2025)

Квадрат разлинован на N × N клеток (1 < N < 30). Исполнитель Робот может перемещаться по клеткам, выполняя за одно перемещение одну из двух команд: вправо или вниз.

По команде вправо Робот перемещается в соседнюю правую клетку, 
по команде вниз – в соседнюю нижнюю.

Квадрат ограничен внешними стенами. Между соседними клетками квадрата также могут быть внутренние стены. Сквозь стену Робот пройти не может. Перед каждым запуском Робота в каждой клетке квадрата лежит монета достоинством от 1 до 100. Посетив клетку, Робот забирает монету с собой; это также относится к начальной и конечной клеткам маршрута Робота. В «угловых» клетках поля - тех, которые справа и снизу ограничены стенами, Робот не может продолжать движение, поэтому накопленная сумма считается итоговой. Таких конечных клеток на поле может быть несколько, включая правую нижнюю клетку поля. При разных запусках итоговые накопленные суммы могут различаться.

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


План подготовки и решения
  1. Подготовка данных в текстовом формате: создаем таблицу с данными и таблицу "запретов"
  2. Программная обработка
Этап А.
  1. Открытие таблици в табличном редакторе Ctr+A - Ctr+C - переход в блокнот - Ctr+V - Ctr+S и получаем таблицу в текстовом формате
  2. Создание таблицы "запретов". Было предложено несколько вариантов, приведем один (не самый "быстрый", но "понятный")
  • создаем копию таблицы, заполняем знаком "о", и "наносим формат" 
  • возле "стенок" заносим знаки "x" и "y" (по правилам ходов, так же как делали бы это "руками")
    исходная таблица таблица запретов
Что-то похожее делается при занесении формул. Важно понять, сколько времени уходит на такую подготовку? 
(На создание двух файлов ушло не более 3-х минут)

Этап В можно разбить на несколько подэтапов
  • чтение данных
  • определение "угловых" клеток
  • заполнение таблиц для "минимального" и "произвольного" обхода  


Чтение из файлов можно организовать разными способами (в том числе и в одну строку). Выделение этого процесса в подпрограмму может "пригодиться"при решении других заданий КЕГЭ. Проверку на "угловую" точку желательно выделить в подпрограмму, поскольку это позволяет "настраивать" алгоритм на разные правила "движения" робота и "перемещать" её в коде. В дальнейшем коде "спрячем" эти подпрограммы.
Далее надо
  • Создать две таблицы V и W для получения результатов минимального и произвольного обходов 
    Начальное заполнение значениями None
  • Заполнить координаты стартовой клетки (ii,jj), значения стартовой клетки в таблицах V, W
  • Заполнить все клетки таблиц V, W  (путем обхода)
Можно вначале решить задание для минимального обхода, затем исправить копию программы и найти второй ответ.
 


Решение есть (около 50 строк кода), но 
  • плохо читается - много квадратных скобок
  • не очень понятно, что делается
Для перебора клеток использовался while вместо "привычного двойного цикла" - это сделано сознательно, для упрощения перехода к различным вариантам обхода таблицы (что будет сделано в следующих примерах)
Было решено переписать программы "для словарей". При этом
  • Таблица с данными и таблица запретов при чтении заносятся в словари
    (словарь упрощает проверку на выход за пределы таблицы)
  • Для храниения результатов также используются словари
    (в них будем заносить только "достижимые" клетки)
  • Обход клеток оставим без изменений
Для начала объединим чтение  из файлов и заполнение словаря (для Таблицы) и множест (для Запретов) в одну программу 


Добавим обход Таблицы и заполнение итоговых словарей. Значение в итоговые словари будем заносить только для "достижимых" клеток (то есть только для тех, в которые можно попасть) 
 


Удалось написать программу с использованием словарей и множеств.  
Что получили:
  • Код программы стал более "сложным", но и более "читаемым"
  • Освоен перебор элементов таблицы через один цикл while 
    (будет проще перейти на другие способы движения)
  • Решение разбито на этапы, поиск результатов ведется "параллельно" 
    (можно копировать строки)
  • Упрощен способ получения результатов
    (вначале получаем значения предков, затем вычисляем результат)
"Угловые" клетки, для отладки, лучше искать вначале но, при наличии "недостижимых угловых" клеток, надо перенести в основной блок
Приведем изменения кода для "обратной" задачи:
Робот стартует в правой нижней клетке и может передвигаться вверх и налево
для файла '18_17874_new.xls' (изменили стенки)

 


Подведём итоги:
Решение занимает около 50 строк кода и значит уложиться в отведённые 8 минут сложно. Следовательно, основным способом должен быть "ручной" (используем табличный редактор). Программный способ нужно понять и освоить, потому что:
  • При ручном способе "несложно" допустить ошибку, проверку (если на это будет время) лучше делать программно 
  • Возможно, будет не очень "удобная" таблица (много стенок, угловых клеток, сложные ходы и т.п.)
  • Вы не очень сильны в "табличных процессорах"
  • Если запреты будут не ввиде стенок (например так, как в варианте Статграда)
  • Для проверки результата и поиска "проблем решения" на тренировочных заданиях
  • Если фрагменты кода будут применяться при решении других заданий КЕГЭ yes
Рекомендуется написать своё решение, используя:
  • привычные Вам обозначения переменных и подпрограмм
  • разбиение на блоки и "визуальные" проверки результатов
  • возможно, удобнее будет вначале найти одно из значений ответа, а затем в копии программы заменить "одно сравнение"
  • сделать вывод о применимости "программного" подхода к решению не ранее 5-7 попыток написания кода



Разумные предложения от учеников (после тренировок на заданиях прошлых лет)
  • Писать программу только для одного из поисков
  • Заносить ограничения сразу в таблицу (заменив числа на x, y) и записывать их перед стенками. 
  • Сократить имена переменных 
Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать