일단 문제는 예전에 원의 방정식에서 배웠던 것 처럼 출발점과 도착점이 각각 원 안의 있냐 없냐로
최소의 행성계 진입/이탈 횟수가 정해진다.
따라서 출발지/도착지와 원의 중점 사이의 거리가 원의 반지름보다 작다면 안에 있다는 것을 알 수 있다.
여기서 주의해야할 점은 출발점과 도착점이 모두 한 원 안에 있을 수 있다는 것이다.
그래서 한 원 안에 있는 경우의 수도 뺴줘야하기 때문에 tmp1과 tmp2를 이용해 출발점과 도착점이
각각 원안에 있는지 확인한 후 두개의 합, 즉 tmp1+tmp2==1인 경우에만 cnt++를 해줌으로써 문제를 풀었다.
기억해야할 점
1. pow 함수와 sqrt 함수는 모두 double형 변수에 대해서만 연산이 가능하고 다른 연산을 할때도, 예를 들어 나눌때, 계산결과가 달라질 수도 있기 때문에 그냥 웬만해서 나머지 변수들도 double 형으로 만들어줬다.
2.원래 enter 함수에서 tmp1<=r*r 일때만 return 1을 해줬는데 이랬더니 main 함수에서 tmp1과 tmp2 모두 1로 출력이 됐다. 왜 그런지는 잘 모르겠고 한번 알아봐야할 것 같다.
#include <stdio.h>
#include <math.h>
int enter(double a, double b,double r, double x,double y)
{
double tmp1, tmp2;
tmp1=pow((a-x),2)+pow((b-y),2); //두 점 사이의 거리
// printf("tmp:%lf r*r:%lf\n",tmp1,r*r);
if(tmp1<=r*r)
return 1;
else
return 0;
}
int main(void)
{
int n;
scanf("%d",&n);
double x1,x2,y1,y2;
for(int i=0;i<n;i++)
{
scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
int k;
scanf("%d",&k);
int cnt=0;
for(int j=1;j<=k;j++)
{
double a,b,r;
scanf("%lf %lf %lf",&a,&b,&r);
int tmp1=0,tmp2=0;
tmp1=enter(a,b,r,x1,y1); // 출발점
//printf("1:%d\n",tmp1);
tmp2=enter(a,b,r,x2,y2); // 도착점
//printf("2:%d\n",tmp2);
if(tmp1+tmp2==1)
cnt++;
}
printf("%d\n",cnt);
}
}
'알고리즘! > Bruteforce' 카테고리의 다른 글
[C] 9663: N-Queen (0) | 2023.08.06 |
---|---|
[C] 14500: 테트로미노 (0) | 2023.08.01 |