(x1, y1), (x2, y2)를 중심으로 하는 각 반지름의 길이가 r1, r2인 두 원의 교점의 개수를 구하는 문제입니다.
원의 중심간의 거리는 아래와 같습니다.
$\sqrt{(x_1-x_2)^2 + (y_1-y_2)^2}$
우선 각 원의 중심이 같을 때의 처리를 해줍시다.
반지름 비교 | 결과 |
---|
$r_1 = r_2$ | -1 |
$r_1 \ne r_1$ | 0 |
다음은 그 외 경우의 처리입니다.
교점의 개수 | 조건 |
---|
2개 | $(r_1+r_2) > i > \vert(r_1-r_2)\vert$ |
1개 | $(r_1+r_2) = i$ |
0개 | $(r_1+r_2) < i$ |
코드 (C++)
#include <cstdio> #include <cmath>
int main(int argc, char const *argv[]) { int x1, x2, r1, r2, y1, y2, T; scanf("%d", &T); for (int i = 1; i <= T; i++) { scanf("%d %d %d %d %d %d", &x1, &y1, &r1, &x2, &y2, &r2); if (x1 == x2 && y1 == y2) { if (r1 == r2) { printf("-1\n"); } else { printf("0\n"); } } else { if (r1 < r2) { int tmp = r2; r2 = r1; r1 = tmp; } double d = sqrt((pow(x1 - x2, 2) + pow(y1 - y2, 2))); if (d > r1 - r2 && d < r1 + r2) { printf("2\n"); } else if (d == r1 + r2 || d == r1 - r2) { printf("1\n"); } else { printf("0\n"); } } } return 0; }
|