给出 nn 个圆,保证任意两个圆都不相交。
然后给出两个点 (x_1,y_1),(x_2,y_2)(x1,y1),(x2,y2),保证均不在某个圆上,要从 (x_1,y_1) \to (x_2,y_2)(x1,y1)→(x2,y2) 画条曲线,问这条曲线最少穿过多少次圆的边界?
输入格式
第一行为一个整数 nn,表示圆的个数;
第二行是 nn 个整数,表示 nn 个圆的 xx 坐标;
第三行是 nn 个整数,表示 nn 个圆的 yy 坐标;
第四行是 nn 个整数,表示 nn 个圆的半径 rr;
第五行是四个整数 x_1,y_1,x_2,y_2x1,y1,x2,y2。
输出格式
仅一个整数,表示最少要穿过多少次圆的边界。
输入输出样例
7 1 -3 2 5 -4 12 12 1 -1 2 5 5 1 1 8 1 2 1 1 1 2 -5 1 12 1
3
问题分析:其实这个题目主要的问题就是读题的问题,一共有n个不相交的圆,求两点连成的曲线多少次经过圆
第一步:对于一个圆来说,什么时候不相交?比较点距与半径的大小就可以。因为对于曲线没有什么要求,一内一外必然会相交,其余的情况都可以不叫,所以我们再分析的时候只用考虑这一点就好了。
第二:无论几个圆,和一个效果是一样的,使用一个for循环,以此计数
第三:详见代码
#include<stdio.h>
#include<math.h>
int main()
{int n,a,b,c,d,sum=0,p,q,h,k;
int x[3214],y[2342],r[2433];
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&x[i]);}
for(int j=1;j<=n;j++){
scanf("%d",&y[j]);}
for(int i=1;i<=n;i++){
scanf("%d",&r[i]);}
scanf("%d%d%d%d",&a,&b,&c,&d);
for(int j=1;j<=n;j++)
{
p=x[j];
q=y[j];
h=r[j];
if((sqrt((p-a)*(p-a)+(q-b)*(q-b))-h)*(sqrt((c-p)*(c-p)+(d-q)*(d-q))-h)<0)
sum++;
}
printf("%d",sum);
return 0;
}
ps:目前本人还在学c基础之中,想着一这种方式给自己留下一点点回忆
uu们有什么问题,一起交流啊!!
Add oil!