曲线交圆C语言

该博客讨论了一个算法问题,涉及在不相交的圆中找到两点间曲线的最小穿圆次数。给定n个圆的坐标和半径,以及两个点的坐标,目标是计算从一点到另一点的曲线至少会穿过多少个圆的边界。博主通过读取输入,判断每个圆与两点连线的关系来实现计数,并展示了C语言的实现代码。
摘要由CSDN通过智能技术生成

给出 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!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明日青辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值