[ 사각형과 점과의 거리 ]
사각형과 점과의 거리 2차원 평면 상에서 두 점 p(x1, y1), q(x2, y2) 사이의 직선거리(Euclidean distance) d2(p,q)와 직각 거리(rectilinear distance) d1(p,q)는 다음과 같이 정의한다.

예를 들어, 두 점 (2, 3), (5, 7) 의 직선거리는 5이며, 직각거리는 |2-5|+|3-7|=3+4=7 이다.

또한, 직사각형과 점과의 직선거리, 직각거리는 이 점과 직각사각형에 있는 어떠한 점과의 각각 직선거리, 직각거리 중에서 가장 가까운 거리로 정의한다.
단, 점이 직사각형의 내부와 변 위에 위치하는 경우에, 점과 직사각형의 직선거리와 직각거리는 모두 0 으로 정의한다.
예를 들어, 위 그림에서 점 p, q 와 사각형과의 직선거리와 직각거리는 모두 0 이다.
그리고, 점 r, s, t와 사각형과의 직선거리의 제곱은 각각 4, 13, 9이며, 점 r, s, t와 사각형과의 직각거리는 각각 2, 5, 3이다.
직사각형과 한 개의 점이 주어졌을 때, 이들 사이의 직선거리의 제곱과 직각거리를 계산하는 프로그램을 작성하시오.
입력
입력은 표준입력(standard input)을 사용한다.
입력은 t 개의 테스트 케이스로 주어진다.
입력 파일의 첫 번째 줄에 테스트 케이스의 개수를 나타내는 정수 t 가 주어진다.
두 번째 줄부터 두 개의 줄마다 한 개의 테스트 케이스에 해당하는 데이터가 입력된다.
각 테스트 케이스의 첫 번째 줄에는 사각형의 위치에 대한 데이터가 나타나며, 두 번째 줄에는 한 점의 좌표가 나타난다.
사각형의 위치는 네 개의 정수 x1 y1 x2 y2 (0 ≤ x1 < x2 ≤ 1,000, 0 ≤ y1 < y2 ≤ 1,000) 로 표시되며, (x1, y1) 은 사각형의 왼쪽 아래 꼭지점의 좌표이며, (x2, y2) 는 사각형의 오른쪽 위 꼭지점의 좌표이다.
두 번째 줄에 나타나는 점의 좌표는 두 개의 정수 x y (0 ≤ x, y ≤ 1,000) 로 표시되며 (x, y) 가 그 점의 좌표이다.
입력되는 각 정수 사이에는 한 개의 공백이 있으며, 잘못된 데이터가 입력되는 경우는 없다.
출력
출력은 표준출력(standard output)을 사용한다.
입력되는 테스트 케이스의 순서대로 다음 줄에 이어서 각 테스트 케이스의 결과를 출력한다.
각 테스트 케이스의 출력되는 첫 줄에 입력되는 사각형과 점과의 직선거리의 제곱을 나타내는 정수와 직각거리를 나타내는 정수를 순서대로 출력한다.
두 정수 사이에는 한 개의 공백을 둔다.
입력과 출력의 예

c++ 소스코드
|
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
# include <iostream>
# include <math.h>
# include <stdlib.h>
using namespace std;
int main(){
int t;
cin >> t;
for(int i = 0; i < t; i++)
{
int x1, y1, x2, y2, x, y, X, Y;
int distance1 = 0, distance2 = 0;
cin >> x1 >> y1 >> x2 >> y2 >> x >> y;
if((x >= x1) && (x <= x2) && (y >= y1) && (y <= y2))
{
cout << 0 << " " << 0 << endl;
}
else
{
if((x >= x1) && (x <= x2) && (y > y2))
X = x, Y = y2;
else if((x >= x1) && (x <= x2) && (y < y2))
X = x, Y = y1;
else if((y >= y1) && (y <= y2) && (x > x2))
X = x2, Y = y;
else if((y >= y1) && (y <= y2) && (x < x1))
X = x1, Y = y;
else if((x > x2) && (y > y2))
X = x2, Y = y2;
else if((x > x2) && (y < y1))
X = x2, Y = y1;
else if((x < x1) && (y > y2))
X = x1, Y = y2;
else
X = x1, Y = y1;
distance1 = pow(x - X, 2) + pow(y - Y, 2);
distance2 = abs(x - X) + abs(y - Y);
cout << distance1 << " " << distance2 << endl;
}
}
return 0;
}
|
cs |
'Programming Language > C++' 카테고리의 다른 글
| [c++] 삼각형 면적 (0) | 2020.10.31 |
|---|---|
| [c++] 삼각형의 종류 (2) (0) | 2020.10.31 |
| [c++] 삼각형의 종류 (1) (0) | 2020.10.31 |
| [c++] 수직/수평 선분의 교차 (0) | 2020.10.31 |
| [c++] 끝자리 숫자 계산하기 (0) | 2020.10.31 |













