uva 10112 - Myacm Triangles 简单计算几何+枚举

来源:互联网 发布:苹果mac软件免费下载 编辑:程序博客网 时间:2024/05/21 09:50

题意:求组成三角形的最大面积的三个点   在这三个点的中间边上不能有点   

最多15个点   枚举所有情况不会超时    还有一个知识就是判断点是否在三角形内     这用的是面积判别法    还有射线法和转角法      就不介绍了有兴趣的自己查查资料       

下面看代码

#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;struct Point{    int x,y,ok;//整数就是好不用考虑精度    char c;}s[15],str[3],tr[3];typedef struct Point point;int num[15],N;int  area_max;int cmp(point a, point b){    if(a.c < b.c)return 1;}int  Area(point p1,point p2,point pb)//其实这道题不用double都能过  我直接改int了{    return fabs((p1.x-pb.x)*(p2.y-pb.y)-(p2.x-pb.x)*(p1.y-pb.y));}int Solve(){    int area = Area(str[0],str[1],str[2]);    if(area < area_max) return 0;//比当前的面积还小  题目说了不会出现两个面积相等的    int  sum = 0;    for(int i = 0; i < N; i++)    {        if(s[i].ok)continue;//选出来的点不参与计算        sum = Area(s[i],str[1],str[2])+              Area(s[i],str[1],str[0])+              Area(s[i],str[0],str[2]);        if(area == sum)return 0;//在三角形内就退出    }    //不在三角形内执行下面的操作    area_max = area;    for(int i = 0; i < 3; i++)        tr[i]=str[i];}void combine(int n, int m,const int M ){    for(int i=n; i>=m; i--)  // 注意这里的循环范围    {        num[m-1]= i - 1;        if (m > 1)            combine(i-1,m-1,M);        else      // m == 1, 输出一个组合        {            int t = 0;            for(int j=M-1; j>=0; j--)            {               s[num[j]].ok = 1;               str[t++] = s[num[j]];            }            Solve();            for(int k = 0; k < N; k++)//这一定要记着初始化 找了一个小时才找到错在这里。。            s[k].ok = 0;        }    }}int main(){    #ifdef LOCAL    freopen("in.txt","r",stdin);    #endif // LOCAL    while((scanf("%d\n",&N),N)!=0)    {        for(int i = 0; i < N; i++)        {            scanf("%c%d%d\n",&s[i].c,&s[i].x,&s[i].y);            s[i].ok = 0;        }        area_max = 0;        combine(N,3,3);//枚举3个点的所有组合        sort(tr,tr+3,cmp);        for(int i = 0; i < 3; i++)            printf("%c",tr[i].c);        printf("\n");    }    return 0;}

 

原创粉丝点击