题目描述
给出n个圆,保证任意两个圆都不相交
然后给出两个点(x1,y1),(x2,y2),从(x1,y1)->(x2,y2)画条曲线,问该曲线最少穿过多少次圆的弧?
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef struct
{
double x;
double y;
double r;
}circle;
typedef struct
{
double x;
double y;
}point;
int main()
{
int num,count=0;
//printf("%lf",pow(2,4));
printf("请输入互不相交的圆的数目:");
scanf("%d",&num);
circle roll[num];
point a,b;
printf("请按顺序分别输入圆的x坐标,y坐标和半径\n");
for(int i=0;i<num;i++)
{
int check=0;
//printf("%lf",fabs(-0.12));
printf("圆%d:",i+1);// lf是C语言中double的格式字符,用于格式化输入输出。
scanf("%lf,%lf,%lf",&roll[i].x,&roll[i].y,&roll[i].r);//在%lf后加\t会多输入一次
for(int j=0;j<i;j++)
{
double a=pow((roll[i].x-roll[j].x),1);
if((sqrt(pow(roll[i].x-roll[j].x,2)+pow(roll[i].y-roll[j].y,2))>(roll[i].r+roll[j].r))||((sqrt(pow(roll[i].x-roll[j].x,2)+pow(roll[i].y-roll[j].y,2)))<fabs(roll[i].r-roll[j].r)))
;
else
{
printf("需要输入的圆不合要求\n");
check++;
break;
}
}
if(check!=0)
{
i--;
check=0;
}
}
printf("请输入点a的x坐标和y坐标:");
scanf("%lf,%lf",&a.x,&a.y);
while(1)
{
printf("请输入点b的x坐标和y坐标:");
scanf("%lf,%lf",&b.x,&b.y);
if(a.x==b.x&&a.y==b.y)
printf("a与b不可重合");
else
break;
}
if(a.x!=b.x)
{
double k;
k=(a.y-b.y)/(a.x-b.x);
for(int i=0;i<num;i++)
{
double distance=(abs(k*roll[i].x-roll[i].y-k*a.x+a.y))/sqrt(pow(k,2)+1);
if(distance<roll[i].r)
{
double d1,d2;
d1=sqrt(pow(roll[i].x-a.x,2)+pow(roll[i].y-a.y,2));
d2=sqrt(pow(roll[i].x-b.x,2)+pow(roll[i].y-b.y,2));
if(d1==roll[i].r||d2==roll[i].r)
{
if(d1==roll[i].r)
count++;
if(d2==roll[i].r)
count++;
}
else if(d1<roll[i].r&&d2<roll[i].r)
;
else
{
if(d1<roll[i].r||d2<roll[i].r)
count++;
}
}
else if(distance==roll[i].r)
{
for(int i=0;i<num;i++)
{
double k1,k2;
if(roll[i].x==a.x||roll[i].x==b.x)
count++;
else
{
k1=(roll[i].y-a.y)/(roll[i].x-a.x);
k2=(roll[i].y-b.y)/(roll[i].x-b.x);
if(k1*k2<0)
count++;
}
}
}
}
}
else
{
double length=abs(a.y-b.y);
for(int i=0;i<num;i++)
{
double d1,d2;
d1=sqrt(pow(roll[i].x-a.x,2)+pow(roll[i].y-a.y,2));
d2=sqrt(pow(roll[i].x-b.x,2)+pow(roll[i].y-b.y,2));
if(abs(roll[i].x-a.x)>roll[i].r)
{
}
else if(abs(roll[i].x-a.x)==roll[i].r)
{
double k1,k2;
k1=(roll[i].y-a.y)/(roll[i].x-a.x);
k2=(roll[i].y-b.y)/(roll[i].x-b.x);
if(k1*k2<0)
count++;
}
else
{
if(d1<roll[i].r&&d2<roll[i].r)
;
else if(d1<roll[i].r||d2<roll[i].r)
count++;
else
{
}
}
}
}
printf("由点a、b引出的曲线至少经过的圆弧数为:%d",count);
}