백준문제풀이

백준 문제 1002번 터렛 문제풀이 c++

노가다 김씨 2022. 3. 13. 10:49

https://www.acmicpc.net/problem/1002

 

1002번: 터렛

각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.

www.acmicpc.net

 

문제해석

 

두 점 사이의 거리공식을 통해 방정식을 세우면 원의 방정식이 나오는데 결국 두 원의 교점의 개수를 구하는 문제가 된다.

 

두 원이 일치할때 무한대이므로 -1을 출력한다.

 

두 원의 중심사이의 거리가 두 원의 반지름의 차이보다는 크고 두 원의 반지름의 합보다는 작은경우

두 원의 교점이 두개가 되므로 2를 출력한다.

 

두 원의 중심사이의 거리가 두 원의 반지름의 차이와 같거나 두 원의 반지름의 합과 같은경우

두 원의 교점이 한개가 되므로 1을 출력한다.

 

그 외에는 0을 출력한다.

 

코드

 

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int main(){
    cout.tie(NULL);
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);
    int t,x1,y1,r1,x2,y2,r2;
    cin>>t;
    while(t--)
    {
        cin>>x1>>y1>>r1>>x2>>y2>>r2;
        if(x1==x2&&y1==y2&&r1==r2)
        {
            cout<<-1<<"\n";
        }
        else
        {
            if((r1-r2)*(r1-r2)<(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)&&(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)<(r1+r2)*(r1+r2))
            {
                cout<<2<<"\n";
            }
            else if((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)==(r1+r2)*(r1+r2)||(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)==(r1-r2)*(r1-r2))
            {
                cout<<1<<"\n";
            }
            else
            {
                cout<<0<<"\n";
            }
        }
    }
}