- •Тема: Перебор вариантов. Задача 1. Замечательные числа
- •Задача 2. Острова
- •Задача 3 Клавиатура
- •Задача 4 . Вырубка деревьев
- •Краткие методические рекомендации по решению задачи
- •Оценка решения
- •Формат входных данных
- •Формат выходных данных
- •Работа с большими числами
- •Золото племени абба
- •Сортировка и поиск
- •2. Домашнее задание.
- •Метод перебора вариантов, отсечения перебора
- •Сумма двух чисел
- •Элементы вычислительной геометрии
- •4. Две окружности
- •Эффективные структуры данных
- •5. Поиск прямоугольников (Время: 0,5 сек. Память: 16 Мб Сложность: 34%)
- •Тема 1: «Работа с длинными числами»
- •Тема 2: Алгоритмы поиска и сортировки
- •Тема 3: Аналитическая геометрия
- •Тема 4: Перебор вариантов
- •Тема 5: Строки. Элементы лексического и синтаксического разобра
- •Задача 3. "Функция"
- •Ограничения
- •Площади покрытия антенны
- •Площадь покрытия решение
- •Элементы лексического и синтаксического разбора Шифровка
- •Шифровка Решение
- •Сортировка и поиск Независимые судьи
- •Независимые судьи Решение
- •Сувениры
- •Сувениры Решение
- •Треугольник Условие задачи
- •Треугольник Решение
- •Олимпиадные задачи по информатике
- •Задача 1. «Код да Винчи»
- •Задача 3 «Буквы»
- •Задача 4 «Соревнования»
- •Задача «Красивая последовательность»
- •Тема: Задача на динамическое программирование
- •Динамическое программирование Задача: Черепашка
- •Решение
- •Тема: Работа с большими числами
- •Тема: Сортировка и выбор
- •Задача. Подземная дорога (поиск в ширину)
- •Формат входных данных
- •Задача rebus
- •Задача “Эчпочмаки”
- •Задача “Ниточка”
- •Задача “Обезьяны”
- •Задача Интересное число
Ограничения
Для успешного выполнения программы при любых значениях необходимо провести ряд тестов и выявить ограничения, т.е. такие входные данные при которые решение программы невозможно или оно является неразумным в данном контексте.
Во-первых, в данной задаче необходимо ввести ограничение на несовпадение точек A (x1; y1), B (x2; y2) и С (х3; у3). Т.е. во входных данных не должно существовать одинаковых точек.
Во-вторых, возможны случаи когда точки A (x1; y1), B (x2; y2) и С (х3; у3) лежат на одной прямой. В данном случае теряется смысл построения перпендикуляра к отрезку, целесообразным становится сообщить об этом пользователю и прекратить работу программы. Если действительно входные данные (точки) лежат на одной прямой, то по той же вышеуказанной формуле нахождения косинуса угла можно выявить такой момент, добавив условие на равенство модуля косинуса хотя бы одного угла единице. Как уже было замечено для данной проверки необходимо и достаточно проверить лишь один угол.
Алгоритм решения:
Вводим координаты трех точек A (x1; y1) , B (x2; y2) и С (х3; у3)
Проверяем точки на совпадение(((x1=x2) and (y1=y2)) or ((x2=x3) and (y2=y3)) or ((x1=x3) and (y1=y3)))
Находим длины отрезков АС, AB, BC (АС:=sqr(x1-x3)+sqr(y1-y3))
Находим косинусы углов b1:=(AB+BC-AC)/(2*sqrt(AB*BC));
Проверяем равны ли они 1(или хотя бы один из них – принадлежат ли они одной прямой) if (abs(a1)=1) then
Проверяем отрицательные или положительные косинусы углов => если >0,то«на продолжение», иначе «на отрезок»
program otrezok ; var x1,x2,x3,y1,y2,y3,AC,AB,BC,a1,b1:real; k,k1:text; begin
{Считывание данных из файла} assign (k, 'S.txt'); {привязка переменной k к файлу S} reset(k); {открываем существующий файл S.txt} readln(k,x1,y1); {ввод координат начала отрезка, точки А} readln(k,x2,y2); {ввод координат конца отрезка, точки В} readln(k,x3,y3); {ввод координат точки С} close(k); {закрыть текстовый файл c переменной k}
{Проверка точек на совпадение}
if (((x1=x2) and (y1=y2)) or ((x2=x3) and (y2=y3)) or ((x1=x3) and (y1=y3))) then
begin
assign(k1, 'S1.txt');
rewrite(k1);
writeln('Введены неверные данные');
writeln(k1,'Введены неверные данные');
close(k1);
end else
{Поиск косинусов углов при отрезке по теореме косинусов}
begin АС:=sqr(x1-x3)+sqr(y1-y3); { нахождение длины отрезка АС}
АВ:=sqr(x2-x1)+sqr(y2-y1); { нахождение длины отрезка АВ} ВС:=sqr(x3-x2)+sqr(y3-y2); { нахождение длины отрезка ВС} b1:=(AB+BC-AC)/(2*sqrt(AB*BC)); { косинус угла АВС} a1:=(AC+AB-BC)/(2*sqrt(AC*AB)); { косинус угла ВАС}
if (abs(a1)=1) then { если косинус хотя бы одного угла равен 1}
{Проверка точек на принадлежность одной прямой}
begin
assign(k1, 'S1.txt');
rewrite(k1);
writeln('Точки лежат на одной прямой');
writeln(k1,'Точки лежат на одной прямой');
close(k1);
end else
begin if (a1 < 0) or (b1 < 0) then {если косинусы углов отрицательные}
{Вывод результатов} begin assign(k1, 'S1.txt'); rewrite(k1); writeln('на продолжение'); writeln(k1,'на продолжение');
close(k1); end else { если косинусы углов положительные} begin assign(k1, 'S1.txt'); rewrite(k1); writeln ('на отрезок'); writeln(k1,'на отрезок'); close(k1); end; end;
end;
end.
Тестирование задачи
Координаты точек A, B, C. |
Ответ |
1 2 1 2 3 3 |
Введены неверные данные |
2 2 3 4 5 8 |
Точки лежат на одной прямой |
0 0 -3 2 -5 0 |
На продолжение |
4 4 7 3 9 5 |
На продолжение |
1 4 5 -1 -1 -1 |
На отрезок |
4 8 1 2 3 3 |
На отрезок |
Элементы вычислительной геометрии
