문제 링크입니다: https://www.acmicpc.net/problem/1004
터렛 문제(http://jaimemin.tistory.com/513?category=988050)와 같이 기하학 문제였기 때문에 점과 점 사이의 거리 공식을 또 사용하였습니다.
핵심은 시작점과 도착점의 위치였습니다.
시작점과 도착점이 모두 주어진 행성 내/외에 있다면 굳이 지나가지 않아도 됩니다.
하지만 시작점이 행성 내부에 있고 도착점이 행성 외부에 있거나 시작점이 행성 외부에 있고 도착점이 행성 외부에 있다면 반드시 지나가야합니다.
#include <iostream>
#include <cmath>
using namespace std;
int x, y, x2, y2; //시작점, 도착점
int cx, cy, r; //주어진 행성계의 중점, 반지름
double diffStart, diffDestination;
pair<int, int> start, destination;
pair<int, int> planet;
//거리 계산
void calculateDistance(void)
{
//주어진 행성의 중점과의 거리 계산
diffStart = sqrt(pow(start.first - cx, 2.0) + pow(start.second - cy, 2.0));
diffDestination = sqrt(pow(destination.first - cx, 2.0) + pow(destination.second - cy, 2.0));
}
//지나가야할 행성 수
int mustPassNum(void)
{
calculateDistance();
//시작점과 도착점 모두 행성 안에 있거나 행성 밖에 있으면 안 지나가도 된다.
//하지만 시작점은 안에 있고 도착점은 밖에 있거나
//도착점은 안에잇고 시작점은 밖에 있으면 지나가야한다.
double multiple = (r - diffStart)*(r - diffDestination);
if (multiple < 0)
return 1;
else
return 0;
}
int main(void)
{
int test_case;
cin >> test_case;
for (int i = 0; i < test_case; i++)
{
cin >> x >> y >> x2 >> y2;
start = make_pair(x, y);
destination = make_pair(x2, y2);
int planetNum;
cin >> planetNum;
int result = 0;
for (int j = 0; j < planetNum; j++)
{
cin >> cx >> cy >> r;
result += mustPassNum();
}
cout << result << endl;
}
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'알고리즘 > BOJ' 카테고리의 다른 글
백준 1475번 방 번호 (0) | 2018.05.05 |
---|---|
백준 1037번 약수 (2) | 2018.05.04 |
백준 1002번 터렛 (0) | 2018.05.01 |
백준 14926번 Not Equal (0) | 2018.05.01 |
백준 1085번 직사각형에서 탈출 (0) | 2018.04.30 |