Задача. Принадлежит ли точка [latex](x, y)[/latex] фигуре на рисунке?
Входные данные
Координаты точки в формате [latex](x, y)[/latex] ([latex]x, y[/latex] — действительные числа).
Выходные данные
Вывести «YES», если точка принадлежит фигуре, и «NO» в противоположном случае.
(Точку, которая находится на контуре, также считаем принадлежащей данной фигуре).
Тесты
[latex]x[/latex] | [latex]y[/latex] | Результат |
0 | 0 | YES |
-5 | -5 | YES |
0 | 2.5 | YES |
3.5 | 4.2 | YES |
-4 | -2.7 | YES |
3 | -4 | NO |
-2 | -1.5 | NO |
1 | 6 | NO |
3.5 | 0.5 | NO |
1000 | 2 | NO |
Решение
Проанализировав фигуру, можно определить, что она не симметрична, хотя данное свойство было бы нам полезно. Однако мы имеем полное право выполнить параллельный перенос фигуры на [latex]0.5[/latex] единиц влево. Рассмотрим текущее расположение фигуры.
Работать с фигурой стало проще, благодаря симметричности относительно начала координат [latex]O[/latex]. Для того чтобы не противоречить данному условию из-за выполненного сдвига, как только считываем координаты, уменьшаем абсциссу на [latex]0.5[/latex] единиц.
(На рисунке выделены основные данные, обозначенные определенными константами, которые понадобятся нам в ходе решения).
Для определения принадлежности точки фигуре будем постепенно убирать те области, в которых точка явно не может принадлежать фигуре:
- В первую очередь исключим все точки, у которых модули значений координат превышают [latex]5.5[/latex] по оси абсцисс или [latex]5[/latex] по оси ординат.
(Условие проверки : [latex]|y| > c [/latex] [latex]\vee[/latex] [latex]|x| > d [/latex] ) - Осталось рассмотреть две области, в которых точка не принадлежит фигуре тогда и только тогда, когда лежит ниже чем прямая [latex]y = 2[/latex] и правее [latex]x = 1.5[/latex] или же выше чем [latex]y = -2[/latex] и левее [latex]x =- 1.5[/latex].
(Условие проверки : [latex](x < -b[/latex] [latex]\wedge[/latex] [latex]y > -a)[/latex] [latex]\vee[/latex] [latex](x > b[/latex] [latex]\wedge[/latex] [latex]y < a)[/latex]) - Если хотя бы одно из предыдущих условий выполнилось, приходим к заключению, что точка не принадлежит данной фигуре. Выводим «NO».
В противном случае выводим «YES».
Код программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#include <iostream> #include <math.h> using namespace std; const double a = 2; const double b = 1.5; const double c = 5; const double d = 5.5; int main(){ double x, y; cin >> x >> y; x -= 0.5; cout << (fabs(y) > c || fabs(x) > d || (x < -b && y > -a) || (x > b && y < a) ? "NO" : "YES"); return 0; } |
Я в восторге! Отличная идея! Молодец.
Однако всё слишком хорошо, чтобы быть правдой. Ваша программа утверждает, что точка 10000 2 принадлежит фигуре. А точка ооооочень от неё далека.
Но, не сдавайтесь.
Спасибо большое. Добавлена пропущенная проверка, отчет дополнен и переработан.
Хорошо. Зачтено.