#include #include #include #include #include #include using namespace std; #define FNAME "myacm.txt" #define cin fin ifstream fin(FNAME); #define EPS FLT_EPSILON #define NMONUMENT_MAX 15 #define deq( a, b ) (fabs((a) - (b)) < EPS) #define PARALLEL 0 #define LEFT 1 #define RIGHT 2 class Monument { public: char label; int x, y; Monument() {} Monument( int x, int y ) : x(x), y(y) {} bool operator < ( const Monument &m ) const { return (label < m.label); } }; int nmonument; Monument M[NMONUMENT_MAX]; int direction( const Monument &p, const Monument &q, const Monument &t ) { const double cp = (q.x-p.x)*(t.y-p.y) - (t.x-p.x)*(q.y-p.y); if ( deq(cp, 0) ) return PARALLEL; return (cp > 0)? LEFT : RIGHT; } bool isValid( int i, int j, int k ) { for ( int n = 0; n < nmonument; n++ ) { if ( n == i || n == j || n == k ) continue; const int ij = direction(M[i], M[j], M[n]); const int jk = direction(M[j], M[k], M[n]); const int ki = direction(M[k], M[i], M[n]); if ( ij != PARALLEL && ij != direction(M[i], M[j], M[k]) ) continue; if ( jk != PARALLEL && jk != direction(M[j], M[k], M[i]) ) continue; if ( ki != PARALLEL && ki != direction(M[k], M[i], M[j]) ) continue; return false; } return true; } int main() { while ( cin >> nmonument && nmonument != 0 ) { for ( int i = 0; i < nmonument; i++ ) cin >> M[i].label >> M[i].x >> M[i].y; sort(M, M+nmonument); int maxArea = -1; char labels[3]; for ( int i = 0; i < nmonument; i++ ) for ( int j = i+1; j < nmonument; j++ ) for ( int k = j+1; k < nmonument; k++ ) { const int areadup = abs((M[k].y-M[i].y)*(M[j].x-M[i].x) - (M[j].y-M[i].y)*(M[k].x-M[i].x)); if ( areadup > 0 && isValid(i, j, k) ) { if ( areadup <= maxArea ) continue; maxArea = areadup; labels[0] = M[i].label; labels[1] = M[j].label; labels[2] = M[k].label; } } cout << labels[0] << labels[1] << labels[2] << endl; } return 0; }