2 条题解

  • 0
    @ 2024-11-22 16:30:43
    #include<stdio.h>
    #include<math.h>
    
    int main(){
    	int n;
    	scanf("%d",&n);
    	while(n--){
    		int x1,y1,r1;
    		int x2,y2,r2;
    		scanf("%d %d %d",&x1,&y1,&r1);
    		scanf("%d %d %d",&x2,&y2,&r2);
    		double sum = (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
    		sum = sqrt(sum);
    		if(sum==(r1+r2)){
    			printf("3\n");
    		}else if(sum>(r1+r2)){
    			printf("4\n");
    		}else if(sum<(r1+r2)&&sum>abs(r1-r2)){
    			printf("2\n");
    		}else if(sum==abs(r1-r2)){
    			printf("1\n");
    		}else if(sum==0){
    			printf("-1\n");
    		}else if(sum<abs(r1-r2)&&sum>0){
    			printf("0\n");
    		}
    	}
    	return 0;
    }
    
    • 0
      @ 2024-10-26 20:08:55

      题目描述

      wyswd

      ys特别喜欢玩ys,但是ys的纠缠之缘一直不够,即使ys非常的欧,但是他也没有多少纠缠之缘。现在有两颗纠缠之缘即将发生碰撞,ys需要找到平面内所有与这两个纠缠之缘相切的直线来改变纠缠之缘运动的方向,但ys不知道答案是多少,你能帮助ys找出答案,拯救ys的ys吗。(纠缠之缘是个圆形)

      第一行一个正整数 TT 代表测试数据组数。

      对于每组测试数据:

      第一行三个正整数: x1x_1 , y1y_1 , r1r_1 代表第一个圆的横坐标,纵坐标以及半径。

      第二行三个正整数: x2x_2 , y2y_2 , r2r_2 代表第二个圆的横坐标,纵坐标以及半径。

      思路

      可以将问题转化为两个圆之间的位置关系:

      • 当两个圆重合时,有无数条切线。

      • 当两个圆内含时,不存在切线。

      • 当两个圆内切时,存在 11 条切线。

      • 当两个圆相交时,存在 22 条切线。

      • 当两个圆外切时,存在 33 条切线。

      • 当两个圆外离时,存在 44 条切线。

      分类讨论圆心距和两个圆的半径之间的关系即可通过。

      需要注意计算机使用浮点数来存储小数,浮点数计算会有精度问题。 因此采用距离的平方比大小以保证运算中只含有整数,避免精度问题

      • 1

      信息

      ID
      1038
      时间
      1000ms
      内存
      256MiB
      难度
      8
      标签
      递交数
      182
      已通过
      24
      上传者