链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
QingTian222 发现二维平面上的两颗纠缠之缘(可以看成圆)即将发生纠缠,他需要找到有多少条平面内的不同直线与这两个圆同时相切才能避免损失两次抽卡机会,但是他并不知道答案是多少,但他也不想损失这两次抽卡机会,于是他来求助你,请你告诉他,有多少条不同的直线与给定的两个圆相切。
输入描述:
第一行一个正整数 T(1≤T≤105)T (1 \leq T\leq10^5)T(1≤T≤105) 代表测试数据组数。 对于每组测试数据: 第一行三个正整数: x1x_1x1 , y1y_1y1 , r1r_1r1 代表第一个圆的横坐标,纵坐标以及半径。 第二行三个正整数: x2x_2x2 , y2y_2y2 , r2r_2r2 代表第二个圆的横坐标,纵坐标以及半径。 数据满足 0<xi,yi,ri≤1040 < x_i,y_i,r_i\leq10^40<xi,yi,ri≤104。
输出描述:
对于每一组测试数据,输出一行一个整数,代表答案,若有无限条不同直线满足条件,请输出 “-1” (不含引号)。
示例1
输入
复制1 1 1 1 1 3 1
1 1 1 1 1 3 1
输出
复制3
3
示例2
输入
复制1 1 1 1 1 2 1
1 1 1 1 1 2 1
输出
复制2
2
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL t;
int main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
LL x1, y1, r1;
LL x2, y2, r2;
cin >> t;
while (t--)
{
cin >> x1 >> y1 >> r1;
cin >> x2 >> y2 >> r2;
double d = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));
if (d > r1 + r2) // 外离
{
cout << 4 << "\n";
}
else if (d == r1 + r2)
{
cout << 3 << "\n";
}
else if (d < r1 + r2 && d > abs(r1 - r2))
{
cout << 2 << "\n";
}
else if (d == abs(r1 - r2))
{
if (r1 == r2) // 两个圆相同,有无数条公切线
{
cout << "-1" << "\n";
}
else
{
cout << 1 << "\n";
}
}
else
{
cout << 0 << "\n";
}
}
return 0;
}