Uva--10112 (几何,枚举)

2014-06-13 20:24:16

题意&思路:主要是用S(ABC) =?= S(ABP) + S(APC) + S(PBC)来判断P是否在三角形ABC内,暴力枚举即可。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
const double eps = 1e-8;

struct Vertex{
    char name;
    double x,y;
};
Vertex v[20];

double Get_area(int a,int b,int c){
    return fabs((v[b].x - v[a].x) * (v[c].y - v[a].y)
            - (v[c].x - v[a].x) * (v[b].y - v[a].y));
}

int main(){
    int num,i,j,k,m,Max_area,v1,v2,v3;
    char s[5];
    while(cin >> num && num){
        for(i = 0; i < num; ++i){
            scanf("%s %lf %lf",s,&v[i].x,&v[i].y);
            v[i].name = s[0];
        }
        Max_area = 0.0;
        for(i = 0; i < num; ++i){
            for(j = 0; j < num; ++j){
                if(j != i)
                    for(k = 0; k < num; ++k){
                        if(k != i && k != j){
                            int flag = 1;
                            double Cur_area = Get_area(i,j,k);
                            for(m = 0; m < num; ++m){
                                if(m != i && m != j && m != k)
                                    if(fabs(Get_area(i,j,m) + Get_area(i,m,k) + Get_area(m,j,k) - Cur_area) < eps){
                                        flag = 0;
                                        break;
                                    }
                            }
                            if(flag && Max_area < Cur_area){
                                Max_area = Cur_area;
                                v1 = i;
                                v2 = j;
                                v3 = k;
                            }
                        }
                    }
                }
            }
        char s[3] = {v[v1].name,v[v2].name,v[v3].name};
        sort(s,s + 3);
        printf("%c%c%c\n",s[0],s[1],s[2]);
    }
    return 0;
}

 

posted @ 2014-06-13 20:26  Naturain  阅读(172)  评论(0编辑  收藏  举报