140
Обратите внимание на первые две строчки. Как и в случае задачи нахождения дороги минималь-
ной длины и стоимости, мы ввели фиктивные данные. Такой прием часто используется при решении
задач для упрощения обработки граничных случаев.
Замечание по ограничению 1. Если координаты вершин треугольника заданы в порядке обхода
его против часовой стрелки, то полученная сумма будет отрицательной. Поэтому если Вам неизвест-
но направления обхода вершин в последней строке напишите:
S:=abs(S/2);
Замечание по ограничению 2. Мы считали, что координаты вершин многоугольника положитель-
ны, но как быть если они отрицательны? Для того, чтобы использовать наш подход, воспользуйтесь
свойством геометрических фигур не менять своего размера при параллельном переносе.
Рассмотрим, как решается задача, предложенная на олимпиаде ICI-98.
Алгоритм решения данной задачи носит имя Чучундра - так его назвали авторы: Бондарев В.М.,
Рублинецкий В.И., Сигалов В.Л. Алгоритм назван в честь крысы Чучундры (сказка Р. Киплинга) за
способ ее передвижения.
На первом этапе необходимо построить сеть, состоящую из сторон круга, многоугольников и
прямолинейных отрезков, соединяющих вершины многоугольников, начальную и конечные точки.
Необходимо учитывать только те отрезки, которые не пересекают стороны многоугольника или круга
(препятствия непроходимы).
На втором этапе для этой построенной сети находится кратчайший путь с использованием алго-
ритма Дейкстры.
Для уменьшения количества рассматриваемых вариантов, можно на первом этапе построить вы-
пуклую оболочку для точек начала и конца движения, а также точек вершин треугольника.
Выпуклая оболочка множества N точек плоскости
Задача состоит в том, чтобы перечислить все точки, принадлежащие границе выпуклой оболочки
заданного множества точек, в порядке ее обхода, например, против часовой стрелки (в некоторых за-
дачах например, Треугольник перечислить только угловые точки). Для эффективного решения этой
задачи существует несколько различных алгоритмов Приведем наиболее простую реализацию одного
из них — алгоритма Джарвиса.
Перечисление точек искомой границы выпуклого многоугольника начнем с правой нижней точ-
ки, которая заведомо принадлежит границе выпуклой оболочки. Сложность данного алгоритма соста-
вит O(kN), где k — количество точек в выпуклой оболочке, в худшем случае равное N.
Приведем программу решения данной задачи алгоритмом Джарвиса:
type vv = record
x, y: longint;
end;