Задача
Троечник Серёжа часто просит отличника Васю сделать ему домашнее задание. Так как при всей гениальности Васи он всё же не может справиться с работой мгновенно, то Серёже приходится ждать. Серёже скучно ждать долго без дела. Не так давно он придумал новую игру, чтобы скоротать время.
На белый стол с привязанной к нему системой координат Серёжа кладёт прямоугольный лист чёрной бумаги. Сверху на него кладёт прямоугольный лист белой бумаги, так что тот возможно перекрывает часть чёрного листа. Стороны обеих листов бумаги параллельны осям координат. После этого мальчик выбирает точку на плоскости стола. Если она попадает на чёрный лист, Серёжа считает, что ожидание проходит не скучно, иначе он расстраивается.
Помогите Серёже понять, расстроится он или нет.
Входные данные
Сначала с клавиатуры вводятся координаты левого верхнего угла чёрного прямоугольника, затем правого нижнего, затем координаты углов белого прямоугольника в том же формате и в конце — координаты точки. Все координаты — целые числа, по модулю не превышающие $10000$.
Выходные данные
Программа должна выводить слово «SAD», если Серёжа расстроится (когда точка попадает на границу Серёжа считает её принадлежащей чёрному листу, потому что не любит расстраиваться), и «HAPPY» — в обратном случае.
Тесты
№ | Входные данные | Выходные данные |
1 | 2 10 5 3 4 4 6 1 2 9 | HAPPY |
2 | 2 10 5 3 4 4 6 1 6 3 | SAD |
3 | 0 0 0 0 1 1 1 1 0 0 | HAPPY |
4 | 1 3 3 1 2 3 4 1 3 2 | SAD |
5 | 1 3 3 1 2 3 4 1 2 2 | HAPPY |
Код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <iostream> using namespace std; struct dot { int x, y; dot(){ cin >> x >> y; } }; struct square { dot upper_left, lower_right; bool is_point_on(dot &p) const { return p.x < lower_right.x and p.x > upper_left.x and p.y < upper_left.y and p.y > lower_right.y; } bool is_point_in(dot &p) const { return p.x <= lower_right.x and p.x >= upper_left.x and p.y <= upper_left.y and p.y >= lower_right.y; } }; int main() { square black, white; dot point; cout << ((black.is_point_in(point) and not white.is_point_on(point))?"HAPPY":"SAD"); } |
Сокращенный код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <iostream> using namespace std; int main() { int bl_up_x, bl_up_y, bl_dw_x, bl_dw_y; int wh_up_x, wh_up_y, wh_dw_x, wh_dw_y; int p_x, p_y; cin >> bl_up_x >> bl_up_y >> bl_dw_x >> bl_dw_y; cin >> wh_up_x >> wh_up_y >> wh_dw_x >> wh_dw_y; cin >> p_x >> p_y; bool is_in_black = p_x <= bl_dw_x and p_x >= bl_up_x and p_y <= bl_up_y and p_y >= bl_dw_y; bool is_in_white = p_x < wh_dw_x and p_x > wh_up_x and p_y < wh_up_y and p_y > wh_dw_y; cout << (is_in_black and not is_in_white ? "HAPPY" : "SAD"); } |
Решение
По условию задачи необходимо проверить находится ли точка внутри или на краю черного прямоугольника и при этом не находится ли она внутри белого прямоугольника. Это можно проверить при помощи условных выражений, а именно, зная, что, первая точка, задающая прямоугольник, находится сверху слева, а вторая снизу справа необходимо просто сравнить с их соотвествующими координатами координаты заданной точки. При этом для черного прямоугольника неравенства при проверке нестрогие, а для белого прямоугольника неравенства строгие.
Ссылки
- Задача на e-olymp
- Код решения на ideone
- Код сокращенного решения на ideone
- Засчитанное решение на e-olymp
Для отправки комментария необходимо войти на сайт.