两个几何水题ZOJ 1090 2540

本文探讨了解决几何问题的策略,包括算法选择与精度处理。通过具体案例分析,展示了如何利用4个顶点、3条边及勾股定理解决ZOJ1090与ZOJ2540问题。同时,文中指出使用float类型可能导致WA,并强调了正确使用scanf()与!=EOF避免TLE的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天偷懒了,没有写总结,只好今天补上。

时间:2011-7-6

事件:ZOJ 10902540.

真的是很不好意思写出两个这么水的题,但应为之前没碰过类似的几何题,做起来还是吃力。

对于2540,那绝对是算法的问题,我花了很长时间在在考虑三个顶点上,我想几乎每种情况我都考虑到了,奈何还是WA。无奈加无奈,看看老师的方法,他是用4个顶点3条边加个初中学的勾股定理。OK。

对于1090 精度问题,这是几何问题老生长谈的,用float  WA。

还有一个OJ提交问题while()当时里面的scanf()后面没加!=EOF 提交上去就TLE。

所以,几何问题就两点:算法和精度。    


1090就一个公会、公式给出就OK了,cosA,sinA

海伦公式也可以

include<stdio.h> 
#include<math.h> 
double qiuedge(double x1,double y1,double x2,double y2) 

    double E; 
    E=(double)sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); 
    return E; 

int main()  

    struct vetex{ 
        double x; 
        double y; 
    }vetex; 
    struct vetex V1,V2,V3;
    double a,b,c,r; 
    double A; 
    while(scanf("%lf%lf%lf%lf%lf%lf",&V1.x,&V1.y,&V2.x,&V2.y,&V3.x,&V3.y)!=EOF) 
    { 
        a=qiuedge(V1.x,V1.y,V2.x,V2.y); 
        b=qiuedge(V1.x,V1.y,V3.x,V3.y); 
        c=qiuedge(V2.x,V2.y,V3.x,V3.y); 
        A=acos((b*b+c*c-a*a)/(2*b*c));  
        r=a/(2*sin(A)); 
        //printf("%f\n",r); 
        printf("%.2lf\n",3.141592653589793*2*r); 
    } 
    return 0

zoj  2540
#include<stdio.h> 
int main()//使用了4个顶点,3条边,结合勾股定理 

    struct vetex{ 
        int x; 
        int y;  
    }vetex; 
    struct vetex p1,p2,p3,p4; 
    int a1,a2,a3,T,k=1
    scanf("%d",&T); 
    while(T--) 
    { 
        scanf("%d%d%d%d%d%d%d%d",&p1.x,&p1.y,&p2.x,&p2.y,&p3.x,&p3.y,&p4.x,&p4.y); 
        a1=(p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y); 
        a2=(p3.x-p1.x)*(p3.x-p1.x)+(p3.y-p1.y)*(p3.y-p1.y); 
        a3=(p4.x-p1.x)*(p4.x-p1.x)+(p4.y-p1.y)*(p4.y-p1.y); 
        if(a1==a2&&a1+a2==a3||a1==a3&&a1+a3==a2||a2==a3&&a2+a3==a1) printf("Case %d:\nYes\n",k++); 
            else printf("Case %d:\nNo\n",k++); 
            if(T) printf("\n"); 
    } 
    return 0

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值