首页 > 代码库 > UVA - 10061 How many zero's and how many digits ?

UVA - 10061 How many zero's and how many digits ?

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19099

给定一些点,求构成三角形最大面积,并且这个三角形不能不能包含其他点(在边上也不行)。

因为数据范围很小,所以直接枚举就好,并且还把面积公式告诉了我们,判断点在三角形内的方法是,这个点与其他顶点的面积之和是否等于这个三角形的面积。

#include<cstdio>
#include<cmath>
struct point
{
    char z;
    int x,y;
}p[20];

double area(point a,point b,point c)
{
    return fabs(0.5*((c.y-a.y)*(b.x-a.x)-(b.y-a.y)*(c.x-a.x)));
}

bool check(point a,point b,point c,point d)
{
    if((area(a,b,d)+area(b,d,c)+area(a,d,c))==area(a,b,c)) return 1;
    else return 0;
}

int main()
{
    //freopen("a.txt","r",stdin);
    int n,i,j,k,l;
    while(~scanf("%d",&n))
    {
        if(n==0) break;
        getchar();
        for(i=0;i<n;i++)
        {
            scanf("%c %d %d",&p[i].z,&p[i].x,&p[i].y);
            //printf("%c %d %d\n",p[i].z,p[i].x,p[i].y);
            getchar();
        }
        double s,sum=0;
        char a,b,c;
        for(i=0;i<n;i++)
        {
            for(j=i+1;j<n;j++)
            {
                for(k=j+1;k<n;k++)
                {
                    s=area(p[i],p[j],p[k]);
                    if(s>sum)
                    {
                        for(l=0;l<n;l++)
                        {
                            if(l!=i&&l!=j&&l!=k&&check(p[i],p[j],p[k],p[l])) break;
                        }
                        if(l==n)
                        {
                            sum=s;
                            a=p[i].z;
                            b=p[j].z;
                            c=p[k].z;
                        }
                    }
                }
            }
        }
        printf("%c%c%c\n",a,b,c);
    }
    return 0;
}


UVA - 10061 How many zero's and how many digits ?