C语言试题

题目描述

给出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);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值