Поход и озеро

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

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

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

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