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; }