Pascal ABC

 

ГЛАВНАЯ
ССЫЛКИ
ОЛИМПИАДНЫЕ ЗАДАНИЯ
Очень простые

Проблема с A и B

Трамвайные билеты

Шифр Цезаря

Четные и нечетные члены последовательности

"Мы вас упакуем!"

Простые

Равновеликие прямоугольники

Скобки

 

Уравнение

 

Вирусы

 

КВН

 

Коррекция кода

 

Степень

 

Демократия в опасности

 

Пуговицы

 

A to B

 

Палиндромы

 

Почти Крэг Туми

 

Виза

 

Ездец

 
Средней сложности  

MIME64

 

Куль хацкеры

 

Редкое имя

 

Города

 

Исправления

 

Банки

 

2^n

 

Ниточка

 

Массивище

 

Знакомые

 

Считаем кораблики

Лошадью ходи!

Левые повороты

Прицельное метание помидор

Анаграммы

Треугольник

Принцип компании

Уникальная строка

Конфуз

K-ичные числа

Михаил Густокашин против бюрократии

Агенты

Игра в слова

Сложные

Диски

Домино

Монеты

Программистика

Хитрющая строка

Робот-сапер

Квадраты

Упаковка простых

Оппозиция

 

Замок

 

Многоугольники

 

Электронные часы

 

Дождик

 

Черепаха

 

Метро

 

Террористы

 

Школы

 
Очень сложные/особо интересные  

Система Защиты

 

Бизнес-классики

 

Телеметрия

 

Лесной пожар

 

Олимпиада

 

Автобусный диспетчер

 

 Кубики

 

Электронная почта

 

Автобус

 

 

 

 

ОЛИМПИАДНЫЕ ЗАДАНИЯ

Олимпиадные задачи с рекомендациями к решениям

Задача 32: Левые повороты (DOOI)

Маршрут движения автомобиля задан в виде координат вершин ломаной.
Необходимо определить количество левых поворотов (смежные участки ломаной не лежат на одной прямой). Автомобиль начинает движение с любой точки (!!!Здесь уточнение от меня - автомобиль начинает движение из первой вершины ломаной, а вот ее координаты любые!!!).
Формат входных данных:
Первая строка входного файла input.txt сомстоит из одного числа, количества звеньев ломаной; в последующих строках - пары натуральных чисел, координаты вершин ломаной.
Формат выходных данных:
Выходной файл output.txt содержит одно число - количество левых поворотов

input.txt:
4
1 1
2 2
3 2
3 3
2 3
output.txt:
2

Решение:
Наконец-то геометрическая задача! (терпеть их не могу, если честно, но куда деваться). Звенья ломаной можно представить в виде векторов. А дальше я приведу кусок комментария Александра Николаевича Никитина:

Геометрические алгоритмы: С какой стороны вектора лежит точка?

Если vector(a) и vector(b) - вектора a и b соответственно, то:

vector(a)*vector(b) = ax*by - ay*bx = a*b*sin(beta-alfa)
ax,ay,bx,by - координаты концов векторов
a - длина вектора a
b - длина вектора b
alfa - угол альфа для вектора a
beta - угол бета для вектора b

Вывод: при общей начальной точке двух векторов их векторное произведение больше нуля, если второй вектор направлен влево от первого, и меньше нуля, если вправо.

Если известны две точки, то вектор, основанный на них можно получить вычитанием двух векторов направленных из начала координат: например, есть точка A и точка B

вектор|AB| = Вектор|B| - Вектор|A|, иным словом AB_x = Bx-Ax, AB_y= By-Ay

Таким образом, получается:
Если есть вектор |AB|, заданный координатами ax,ay,bx,by и точка px,py, то для того чтобы узнать лежит ли она слева или справа, надо узнать знак произведения:
(bx-ax)*(py-ay)-(by-ay)*(px-ax)

Итак, вроде бы все понятно (сам прочитал первый раз в жизни - раньше всегда брал готовую функцию). У нас есть два вектора 1-2 и 1-3 если 3 левее вектора 1-2, то поворот левый, иначе не левый (логично). Точно также для вектора 2-3 и точки 4 и т.д.


Далее ð





 


 

 

 
 

СЕРВИС

Copyright © 2008 СОШ №2 им. Н.П. Массонова г.Свислочь © Синица А.А.