您的位置:首页 > 其它

FZU 2213 Common Tangents 第六届福建省赛

2016-08-10 10:15 169 查看
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2213

题目大意:两个圆,并且知道两个圆的圆心和半径,求这两个圆共同的切线有多少条,若有无数条,输出-1,其他条如数输出

解题思路:这道题只需要判断两圆心的距离与半径的距离即可,代码里面有详细解释

AC代码

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;

int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int ans,x1,y1,r1,x2,y2,r2;
scanf("%d %d %d %d %d %d",&x1,&y1,&r1,&x2,&y2,&r2);
if(r1<r2){int temp=r2;r2=r1;r1=temp;;swap(x1,x2);swap(y1,y2);}//第一个为大圆,第二个为小圆
double d=sqrt((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1));//两圆心之间的距离
int rd=abs(r1+r2);//两半径之和
int rc=abs(r1-r2);//两半径之差
if(d==0&&r1==r2) ans=-1;//如果两上圆同心,并且一样大,就是有无数条切线
else
if(rd<d) ans=4;//半径和小于圆心和,即小圆在大圆外
else
if(rd==d) ans=3;//大圆与小圆相外切,有一个交点,小圆在大圆外
else
{
if(d+r2==r1) ans=1;//大圆与小圆相交,小圆在大圆内,有一个交点
else
if(d+r2>r1) ans=2;//大圆与小圆相交,有两个交点
else ans=0;//小圆在大圆里面,且无交点
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐