UVA10112点在三角形内部和边界上

本文讨论了三角形面积计算中忽略绝对值导致错误的案例,并详细介绍了如何正确判断三角形内部点的方法。

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

这题也是醉了,本来应该一发AC的,debug了好久发现原来只是下面求面积的时候忘记加绝对值了,醉了。三角形判定点注意绝对值的问题。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<string>
#include<cmath>
using namespace std;
const double eps=1e-6;
int dcmp(double x)
{
    if(fabs(x)<eps)
        return 0;
    else
        return x>0?1:-1;
}
struct point
{
    char c;
    int x,y;
};
int dot(point a,point b)
{
    return a.x*b.x+a.y*b.y;
}
int cross(point a,point b)
{
    return a.x*b.y-a.y*b.x;
}
double area(point a,point b,point c)
{
    return 0.5*((c.y-a.y)*(b.x-a.x)-(b.y-a.y)*(c.x-a.x));
}
bool inside(point a,point b,point c,point d)
{
    if(dcmp(fabs(area(b,c,d))-fabs(area(a,b,c))-fabs(area(a,c,d))-fabs(area(a,d,b)))==0)
        return 0;
    return 1;
}
int main()
{
   int n;
   while(cin>>n&&n)
   {
      getchar();
       point a[30];
       for(int i=0;i<n;i++)
       {
           cin>>a[i].c>>a[i].x>>a[i].y;
       }
       double Area=0;
       char cx,cy,cz;
       for(int i=0;i<n;i++)
       {
           for(int j=i+1;j<n;j++)
           {
               for(int z=j+1;z<n;z++)
               {
                   int flag=1;
                   for(int k=0;k<n;k++)
                   {
                       if(k!=i&&k!=j&&k!=z&&inside(a[k],a[i],a[j],a[z])==0)
                       {
                       //    cout<<i<<j<<z<<k<<endl;
                           flag=0;
                           break;
                       }

                   }
                   if(flag)
                   {
                       double area2=fabs(area(a[i],a[j],a[z]));
                       if(area2>Area)
                       {
                         //  cout<<"haha"<<endl;
                           Area=area2;
                           cx=a[i].c;
                           cy=a[j].c;
                           cz=a[z].c;
                       }
                   }

               }
           }
       }
       cout<<cx<<cy<<cz<<endl;
   }
   return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值