1004번 - 어린 왕자
주어진 점이 원 안에 존재하는지를 따지면 된다.
즉 각 점과 모든 원들의 중심과의 거리를 구하고, 구한 값을 반지름과 비교한다.
반지름보다 작다면 원안에 존재한다는 것이고, 반지름보다 크다면 원 밖에 존재하는 것이다.
원 밖에 존재하면 겹치는 원은 없다고 문제에 나오기 때문에 어떤 방식으로든 피해서 목적지에 도달 할 수 있다.
따라서 원 안에 존재하게 될때 진입/이탈이 이루어지는데 그 갯수를 세주면 된다.
단 한 원안에 출발점과 목적점이 둘다 존재한다면, 그 값은 카운트 하지 않는다.
<정답 코드>
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 45 46 47 48 49 50 | #include<iostream> #include<math.h> using namespace std; double dist(double x1, double y1, double x2, double y2) { return sqrt((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1)); } int main() { ios::sync_with_stdio(false); cin.tie(NULL); //freopen("input.txt", "r", stdin); int tc; cin >> tc; for (int t = 1; t <= tc; t++) { double x1, x2, y1, y2; cin >> x1 >> y1 >> x2 >> y2; int n, cnt1 = 0, cnt2 = 0; cin >> n; for (int i = 0; i < n; i++) { double x, y, r; cin >> x >> y >> r; double d1 = dist(x, y, x1, y1); double d2 = dist(x, y, x2, y2); if (d1 < r && d2>r) { cnt1++; continue; } if (d2 < r && d1>r) { cnt2++; continue; } } cout << cnt1 + cnt2 << "\n"; } return 0; } | cs |
반응형