반응형

문제 링크

 

1002번: 터렛

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

www.acmicpc.net

 

풀이 )

  두 원 사이의 거리를 이용하는 문제이다.

  두 원의 위치 관계는 다음과 같이 나눌 수 있다. (d^2 = (x2-x1)^2 + (y2-y1)^2)

  • 일치 --- 1 (d == 0 && r1 == r2)
  • 서로 다른 두 점에서 만나는 경우 --- 2 (|r2-r1| < d < r2+r1)
  • 한 점에서 만나는 경우
    • 내접 --- 3 (d == |r2-r1|)
    • 외접 --- 4 (d == r2+r1)
  • 만나지 않는 경우
    • 내부에 있는 경우 --- 5 (d < |r2-r1|)
    • 외부에 있는 경우 --- 6 (d > r2+r1)

 

 

#include <iostream>

using namespace std;

int main(void){
    int t;
    cin >> t;
    while(t--){
        int x1, y1, r1, x2, y2, r2;
        cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
        int dd = (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);
        if(dd == 0){
            if(r1 == r2)	// case 1
                cout << "-1" << endl;
            else			// case 5
                cout << '0' << endl;
            continue;
        }
        if(dd > (r1+r2)*(r1+r2) || dd < (r1-r2)*(r1-r2))	// case 6, 5
            cout << '0' << endl;
        else if(dd == (r1+r2)*(r1+r2) || dd == (r1-r2)*(r1-r2))	// case 4, 3
            cout << '1' << endl;
        else	// case 2
            cout << '2' << endl;
    }
}
반응형

+ Recent posts