반응형
문제 링크: https://www.acmicpc.net/problem/1002
1002번: 터렛
각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.
www.acmicpc.net
<문제 풀이> 기하학
아군의 위치를 A(x1, y1), B(x2, y2), 상대편의 위치를 C(x, y)라고 하고 점과 점 사이의 거리를 계산하면
(x - x1)^2 + (y - y1)^2 = r1^2
(x - x2)^2 + (y - y1)^2 = r2^2
따라서 중심이 A, 반지름이 r1인 원과 중심이 B, 반지름이 r2인 원의 교점의 개수를 찾으면 됩니다.
1. 두 원이 일치할 때 (r1 = r2 and A = B)
2. 내접할 때 (선분 AB = r2 - r1)
두 원이 내접하면 접하는 점과 두 원의 중심이 일직선상에 위치해 있습니다.
3. 외접할 때 (선분 AB = r1 + r2)
두 원이 외접할 때 접하는 점과 두 원의 중심이 일직선상에 위치해 있습니다.
4. 두 원이 떨어져 있을 때 (선분 AB > r2 + r1)
5. 원 안에 원이 있을 때 (선분 AB < r2 - r1)
6. 원이 두 점에서 만날 때 (선분 AB < r1 + r2)
<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
|
#include <iostream>
using namespace std;
int main(void) {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int test_case;
cin >> test_case;
while (test_case--) {
int x1, y1, r1, x2, y2, r2;
cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
int d1 = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);
int d2 = r1 * r1 + 2*r1 * r2 + r2 * r2;
int d3 = r1 * r1 - 2 * r1 * r2 + r2 * r2;
if (r1 == r2 && x1 == x2 && y1 == y2) cout << "-1\n"; // 두 원이 일치
else if (d1 == d3) cout << "1\n"; // 내접
else if (d1 == d2) cout << "1\n"; // 외접
else if (d1 > d2) cout << "0\n"; // 두 원이 떨어져있음
else if (d1 < d3) cout << "0\n"; // 원 안에 다른 원
else cout << "2\n"; // 두 점에서 만날 때
}
return 0;
}
|
cs |
반응형
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준 2075번] N번째 큰 수 (0) | 2020.03.11 |
---|---|
[백준 1715번] 카드 정렬하기 (0) | 2020.03.11 |
[백준 11286번] 절댓값 힙 (0) | 2020.03.10 |
[백준 1927번] 최소 힙 (0) | 2020.03.09 |
[백준 11279번] 최대 힙 (0) | 2020.03.09 |