Common Tangents【第六届福建省大学生程序设计竞赛-重现赛】

本篇介绍了一个算法问题,即给定两个圆的圆心坐标和半径后,如何确定它们之间的共切线数量。文章通过数学方法讨论了所有可能的情况,包括4条、3条、2条、1条、0条以及无限条的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Common Tangents

Time Limit: 1000ms
Memory Limit: 32768KB
This problem will be judged on  FZU. Original ID:  2213
64-bit integer IO format:  %I64d      Java class name:  Main

Two different circles can have at most four common tangents.

The picture below is an illustration of two circles with four common tangents.

Now given the center and radius of two circles, your job is to find how many common tangents between them.

Input

The first line contains an integer T, meaning the number of the cases (1 <= T <= 50.).

For each test case, there is one line contains six integers x1 (−100 ≤ x1 ≤ 100), y1 (−100 ≤ y1 ≤ 100), r1 (0 < r1 ≤ 200), x2 (−100 ≤ x2 ≤ 100), y2 (−100 ≤ y2 ≤ 100), r2 (0 < r2 ≤ 200). Here (x1, y1) and (x2, y2) are the coordinates of the center of the first circle and second circle respectively, r1 is the radius of the first circle and r2 is the radius of the second circle.

Output

For each test case, output the corresponding answer in one line.

If there is infinite number of tangents between the two circles then output -1.

Sample Input

3
10 10 5 20 20 5
10 10 10 20 20 10
10 10 5 20 10 5

Sample Output

4
2
3


题意:给定两个圆心的坐标 和半径
 输出有多少个相切的切线 
一共有 6种可能 4条 3条 2条 1条 0条 无限条(输出-1)

数学问题 考虑到所有情况就好了


#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int main (void)
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int x1,x2,y1,y2,r1,r2;
        int lang,maxr,minr,min,max;
        int x,y;
        scanf("%d%d%d%d%d%d",&x1,&y1,&r1,&x2,&y2,&r2);
        x=abs(x1-x2);
        y=abs(y1-y2);
        lang=x*x+y*y;
        double lang2=sqrt(lang);
        //printf("%lf",lang2);
        if(r1>=r2)
        {
            maxr=r1;
            minr=r2;
        }
        else
        {
            maxr=r2;
            minr=r1;
        }
        max=maxr+minr;
        min=maxr-minr;
        if(lang>max*max)
        {
            printf("4\n");
            continue;
        }
        else if(lang==max*max)
        {
            printf("3\n");
            continue;
        }
        else if(x1==x2&&r1==r2&&y1==y2)//这一步要放在1条的上面 
        {
            printf("-1\n");
            continue;
        }
        else if(lang==min*min)
        {
            printf("1\n");
            continue;
        }

        else if(lang<max*max&&lang2+minr>maxr)//相交注意有2个条件
        {
            printf("2\n");
            continue;
        }
        else if(lang2+minr<maxr)
        {
            printf("0\n");
            continue;
        }
    }
    return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值