求三角形内是否包含某点。就枚举四个点,懒得写凸包了。
#include <cstdio>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;
#define _0 1e-10
int N, A, B, C;
typedef struct
...{
double x, y;
char ch;
} Point;
Point p[15];
double inline dabs ( double d )
...{
return d < _0 ? -d : d;
}
int cmp ( Point &a, Point &b )
...{
if ( a.y == b.y )
return a.x < b.x;
return a.y < b.y;
}
int bCmp ( Point &a, Point &b, Point &c )
...{
//if ac is longer than ab
double del = ( c.x - a.x ) * ( c.x - b.x ) + ( c.y - a.y ) * ( c.y - b.y );
if ( del > _0 )
return 1;
if ( del < -_0 )
return -1;
return 0;
}
int crossDet ( Point &a, Point &b, Point &c )
...{
//if ac is on left side of ab
double del = ( b.x - a.x ) * ( c.y - a.y ) - ( c.x - a.x ) * ( b.y - a.y );
if ( del > _0 )
return 1;
if ( del < -_0 )
return -1;
if ( bCmp ( a, b, c ) <= 0 )
return 0;
return 2;
}
int inArea ( int a, int b, int c, int d )
...{
int x1 = crossDet ( p[a], p[b], p[d] );
int x2 = crossDet ( p[b], p[c], p[d] );
int x3 = crossDet ( p[c], p[a], p[d] );
if ( !x1 || !x2 || !x3 )
return 1;
if ( x1 == x2 && x2 == x3 )
return 1;
return 0;
}
double calc ( int a, int b, int c )
...{
double area = dabs ( 0.5 * ( ( p[c].y - p[a].y ) * ( p[b].x - p[a].x ) - ( p[b].y - p[a].y ) * ( p[c].x - p[a].x ) ) );
int d;
for ( d = 0; d < N; d ++ )
...{
if ( d == a || d == b || d == c )
continue;
if ( inArea ( a, b, c, d ) )
return 0.00;
}
return area;
}
int main ()
...{
//freopen ( "in.txt", "r", stdin );
while ( scanf ( "%d ", &N ) && N )
...{
int i;
for ( i = 0; i < N; i ++ )
scanf ( "%c %lf %lf ", &p[i].ch, &p[i].x, &p[i].y );
int a, b, c;
double t, ans = -1;
for ( a = 0; a < N; a ++ )
for ( b = a + 1; b < N; b ++ )
for ( c = b + 1; c < N; c ++ )
if ( ( t = calc ( a, b, c ) ) > ans )
ans = t, A = p[a].ch, B = p[b].ch, C = p[c].ch;
printf ( "%c%c%c ", A, B, C );
}
return 0;
}
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;
#define _0 1e-10
int N, A, B, C;
typedef struct
...{
double x, y;
char ch;
} Point;
Point p[15];
double inline dabs ( double d )
...{
return d < _0 ? -d : d;
}
int cmp ( Point &a, Point &b )
...{
if ( a.y == b.y )
return a.x < b.x;
return a.y < b.y;
}
int bCmp ( Point &a, Point &b, Point &c )
...{
//if ac is longer than ab
double del = ( c.x - a.x ) * ( c.x - b.x ) + ( c.y - a.y ) * ( c.y - b.y );
if ( del > _0 )
return 1;
if ( del < -_0 )
return -1;
return 0;
}
int crossDet ( Point &a, Point &b, Point &c )
...{
//if ac is on left side of ab
double del = ( b.x - a.x ) * ( c.y - a.y ) - ( c.x - a.x ) * ( b.y - a.y );
if ( del > _0 )
return 1;
if ( del < -_0 )
return -1;
if ( bCmp ( a, b, c ) <= 0 )
return 0;
return 2;
}
int inArea ( int a, int b, int c, int d )
...{
int x1 = crossDet ( p[a], p[b], p[d] );
int x2 = crossDet ( p[b], p[c], p[d] );
int x3 = crossDet ( p[c], p[a], p[d] );
if ( !x1 || !x2 || !x3 )
return 1;
if ( x1 == x2 && x2 == x3 )
return 1;
return 0;
}
double calc ( int a, int b, int c )
...{
double area = dabs ( 0.5 * ( ( p[c].y - p[a].y ) * ( p[b].x - p[a].x ) - ( p[b].y - p[a].y ) * ( p[c].x - p[a].x ) ) );
int d;
for ( d = 0; d < N; d ++ )
...{
if ( d == a || d == b || d == c )
continue;
if ( inArea ( a, b, c, d ) )
return 0.00;
}
return area;
}
int main ()
...{
//freopen ( "in.txt", "r", stdin );
while ( scanf ( "%d ", &N ) && N )
...{
int i;
for ( i = 0; i < N; i ++ )
scanf ( "%c %lf %lf ", &p[i].ch, &p[i].x, &p[i].y );
int a, b, c;
double t, ans = -1;
for ( a = 0; a < N; a ++ )
for ( b = a + 1; b < N; b ++ )
for ( c = b + 1; c < N; c ++ )
if ( ( t = calc ( a, b, c ) ) > ans )
ans = t, A = p[a].ch, B = p[b].ch, C = p[c].ch;
printf ( "%c%c%c ", A, B, C );
}
return 0;
}