반응형
https://www.acmicpc.net/problem/10216
10216번: Count Circle Groups
백준이는 국방의 의무를 수행하기 위해 떠났다. 혹독한 훈련을 무사히 마치고 나서, 정말 잘 생겼고 코딩도 잘하는 백준은 그 특기를 살려 적군의 진영을 수학적으로 분석하는 일을 맡게 되었
www.acmicpc.net
[ 문제풀이 ]
1. 각 진영의 위치와 R을 입력받아 arr에 저장하고, visited 배열을 만들어 각 진영의 방문 여부를 체크해 줍니다.
2. for문을 통해 모든 진영을 돌면서 visited[ i ] 가 0이라면 ans++를 해주고 bfs를 돌며 이어진 진영의 visited를 1로 갱신해 줍니다.
3. ans를 출력합니다.
[ 소스코드 ]
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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | #include<iostream> #include<queue> #include<cmath> using namespace std; struct node { int x, y, R; }; int T, N; node arr[3000]; int visited[3000]; void bfs(int num) { queue<int> q; q.push(num); while (!q.empty()) { const int x = arr[q.front()].x; const int y = arr[q.front()].y; const int R = arr[q.front()].R; q.pop(); for (int i = 0; i < N; i++) { if (visited[i] == 0) { const int xx = arr[i].x; const int yy = arr[i].y; const int RR = arr[i].R; if (sqrt(pow(x - xx, 2) + pow(y - yy, 2)) <= R + RR) { visited[i] = 1; q.push(i); } } } } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> T; for (int t = 0; t < T; t++) { cin >> N; for (int i = 0; i < N; i++) { int x, y, R; cin >> x >> y >> R; arr[i] = { x,y,R }; } int ans = 0; fill(visited, visited + N, 0); for (int i = 0; i < N; i++) { if (visited[i] == 0) { visited[i] = 1; bfs(i); ans++; } } cout << ans << '\n'; } } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 2591번 - 숫자카드 (C++) (0) | 2023.08.21 |
---|---|
[ 백준 ] 2116번 - 주사위 쌓기 (C++) (0) | 2023.08.20 |
[ 백준 ] 3067번 - Coins (C++) (0) | 2023.08.18 |
[ 백준 ] 16965번 - 구간과 쿼리 (C++) (0) | 2023.08.17 |
[ 백준 ] 20007번 - 떡 돌리기 (C++) (0) | 2023.08.16 |