当前位置:编程学习 > C/C++ >>

UVa 10112 - Myacm Triangles

题意:给你4到15个点,求能构成的最大的不覆盖其他点的三角形的面积


这里有一个判断点是否在三角形内的方法:用这个点分别与三角形任意两端点构成三角形,得到三个三角形,如果这三个三角形面积之和与原三角形面积相等,则点在三角形内

数据量极小,暴力枚举即可

[cpp] 
#include <iostream> 
#include <cmath> 
#include <cstring> 
using namespace std; 
int a[50][5]; 
double vector[5][5]; 
double square(double x1,double y1,double x2,double y2,double x3,double y3) 

    double l1=sqrt((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1)); 
    double l2=sqrt((y3-y1)*(y3-y1)+(x3-x1)*(x3-x1)); 
    double l3=sqrt((y2-y3)*(y2-y3)+(x2-x3)*(x2-x3)); 
    double p=(l1+l2+l3)/2; 
    double s=sqrt(p*(p-l1)*(p-l2)*(p-l3)); 
    return s; 

int main() 

    char t; 
    int n,d,e,f,flag; 
    double s,max; 
    while(cin>>n&&n) 
    { 
        memset(a,0,sizeof(a)); 
        for(int i=0; i<n; i++) 
        { 
            cin>>t; 
            cin>>a[t-'A'][0]>>a[t-'A'][1]; 
        } 
        max=0; 
        for(int i=0; i<n; i++) 
            for(int j=i+1; j<n; j++) 
                for(int k=j+1; k<n; k++) 
                { 
                    s=square(a[i][0],a[i][1],a[j][0],a[j][1],a[k][0],a[k][1]); 
                    flag=0; 
                    for(int q=0; q<n; q++)//判断除i,j,k点外其他的点是否在三角形内 
                    { 
                        if(q!=i&&q!=j&&q!=k) 
                        { 
                           double s1=square(a[q][0],a[q][1],a[i][0],a[i][1],a[j][0],a[j][1]); 
                           double s2=square(a[q][0],a[q][1],a[k][0],a[k][1],a[j][0],a[j][1]); 
                           double s3=square(a[q][0],a[q][1],a[i][0],a[i][1],a[k][0],a[k][1]); 
                           if(fabs(s-s1-s2-s3)<1e-9) 
                            { 
                                flag=1; 
                                break; 
                            } 
                            else 
                            flag=0; 
                        } 
                    } 
                    if(s>max&&flag==0) 
                    { 
                        max=s; 
                        d=i+'A'; 
                        e=j+'A'; 
                        f=k+'A'; 
                    } 
                } 
        cout<<(char)d<<(char)e<<(char)f<<endl; 
    } 
    return 0; 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,