hdu(4720) Naive and Silly Muggles

题意:前三个点坐标,要找到一个最小的圆能覆盖这三个点;若第四个点在这个圆外则输出Safe,否则输出 Danger;

前三个点确定一个三角形,若这个三角形是直角三角形或钝角三角形,则圆心在最长边的中点,半径是其一半;

如果为锐角三角形,

              则利用公式;

            x0=((y2-y1)*(y3*y3-y1*y1+x3*x3-x1*x1)-(y3-y1)*(y2*y2-y1*y1+x2*x2-x1*x1))/(2.0*((x3-x1)*(y2-y1)-(x2-x1)*(y3-y1)));
            y0=((x2-x1)*(x3*x3-x1*x1+y3*y3-y1*y1)-(x3-x1)*(x2*x2-x1*x1+y2*y2-y1*y1))/(2.0*((y3-y1)*(x2-x1)-(y2-y1)*(x3-x1)));
            r=sqrt((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0));

 

 

#include"stdio.h"
#include"string.h"
#include"math.h"
double fun(double a1,double b1,double a2,double b2)
{
 return sqrt((a1-a2)*(a1-a2)+(b1-b2)*(b1-b2));
}
int main()
{
 int r1=1,k;
 double x1,x2,x3,y1,y2,y3,a,b,c,p1,p2,r,x0,y0;
 scanf("%d",&k);
 while(k--)
 {
  scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3);
  scanf("%lf%lf",&p1,&p2);
  a=fun(x1,y1,x2,y2);
  b=fun(x1,y1,x3,y3);
  c=fun(x2,y2,x3,y3);
  if(c*c-a*a-b*b>0)
  {
   x0=(x2+x3)/2.0;
   y0=(y2+y3)/2.0;
   r=c/2.0;
  }
  else if(a*a-b*b-c*c>0)
  {
   x0=(x1+x2)/2.0;
   y0=(y1+y2)/2.0;
   r=a/2.0;
  }
  else if(b*b-c*c-a*a>0)
  {
   x0=(x1+x3)/2.0;
   y0=(y1+y3)/2.0;
   r=b/2.0;
  }
  else
  {
      x0=((y2-y1)*(y3*y3-y1*y1+x3*x3-x1*x1)-(y3-y1)*(y2*y2-y1*y1+x2*x2-x1*x1))/(2.0*((x3-x1)*(y2-y1)-(x2-x1)*(y3-y1)));
            y0=((x2-x1)*(x3*x3-x1*x1+y3*y3-y1*y1)-(x3-x1)*(x2*x2-x1*x1+y2*y2-y1*y1))/(2.0*((y3-y1)*(x2-x1)-(y2-y1)*(x3-x1)));
            r=sqrt((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0));

  }
  printf("Case #%d: ",r1++);
  if((p1-x0)*(p1-x0)+(p2-y0)*(p2-y0)<=r*r)
   printf("Danger\n");
  else
   printf("Safe\n");
 }
 return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值