#include <cstdio>
#include <math.h>
/**
* https://www.acmicpc.net/problem/1004
* BOJ 백준온라인져지 1004 어린 왕자 풀이
*/
int main(){
int T;
scanf("%d",&T);
while(T--){
int x1,x2,y1,y2,result=0;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
int N;
scanf("%d",&N);
while(N--){
int cx,cy,r;
scanf("%d%d%d",&cx,&cy,&r);
double d1 = sqrt(pow(x1-cx,2)+pow(y1-cy,2));
double d2 = sqrt(pow(x2-cx,2)+pow(y2-cy,2));
if(d1 <= r && d2 <= r) continue;
else if(d1 <= r) result++;
else if(d2 <= r) result++;
}
printf("%d\n",result);
}
return 0;
}
view raw BOJ_1004.cpp hosted with ❤ by GitHub

예제 입력 

2
-5 1 12 1
7
1 1 8
-3 -1 1
2 2 2
5 5 1
-4 5 1
12 1 1
12 1 2
-5 1 5 1
1
0 0 2

예제 출력 

3
0

문제의 입출력이 너무 많아서 어려운줄 알았는데,

생각해보면 쉬운 문제다.


원 안에 점이 포함되면 ++


원이 2점을 감싸면 continue

두 원의 중심과 반지름만 있으면 관계가 어떻게 되는지 구할 수 있다.


문제를 풀면서 distance를 실수형으로 안해서 많이 틀렸다.

#include <cstdio>
#include <math.h>
/**
* https://www.acmicpc.net/problem/1002
* BOJ 백준온라인져지 1002 터렛 풀이
*/
int max(float a, float b){
return a>b?a:b;
}
int min(float a, float b){
return a>b?b:a;
}
int main(){
int N;
scanf("%d",&N);
while(N--){
int x1, y1, r1, x2, y2, r2;
scanf("%d%d%d%d%d%d",&x1,&y1,&r1,&x2,&y2,&r2);
double d = sqrt(pow((x1-x2), 2) + pow(y1-y2, 2)); // distance = (x1 - x2)^2 + (y1 - y2)^2
int result = 0;
if(d == 0){
if(r1 == r2)
result = -1; // 겹치는 경우
}else if(r1 + r2 == d){
result = 1; // 한 점에서 만나는 경우(외접)
}else if(r1 + r2 > d){ // 원 안의 원
if(d + min(r1, r2) == max(r1, r2))
result = 1; // 내접
else if(d > max(r1, r2) - min(r1, r2))
result = 2;
}
printf("%d\n",result);
}
return 0;
}
view raw BOJ_1002.cpp hosted with ❤ by GitHub


예제 입력 

3
0 0 13 40 0 37
0 0 3 0 7 4
1 1 1 1 1 5

예제 출력 

2
1
0


+ Recent posts