题目:给你平面上的4-15个点,让你找到面积最大的三角形,三角形中不能有其他点。
分析:计算几何。因为数据较小直接枚举所有情况,找到符合题意最大的即可。
判断点在三角形内的犯法很多,我之前一直用,判断点在边的同侧的方法(向量)。
这里利用白书中方法,判断O在△ABC中的方法:S△ABC = S△ABO + S△AOC + S△OBC
这里的面积是大小,不是向量,取绝对值计算。
说明:注意库( ⊙ o ⊙ )啊!白CE了一次。
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
using namespace std;
typedef struct pnode
{
char name;
int x,y;
}point;
point P[20];
int Area( point a, point b, point c )
{
return abs((b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y));
}
int main()
{
int n;
while ( cin >> n && n ) {
for ( int i = 0 ; i < n ; ++ i )
cin >> P[i].name >> P[i].x >> P[i].y;
int Max = 0,a = 0,b = 1,c = 2;
for ( int i = 0 ; i < n ; ++ i )
for ( int j = i+1 ; j < n ; ++ j )
for ( int k = j+1 ; k < n ; ++ k ) {
int flag = 1;
int temp,area = Area( P[i], P[j], P[k] );
for ( int p = 0 ; p < n ; ++ p ) {
if ( p == i || p == j || p == k )
continue;
temp = Area( P[p], P[j], P[k] );
temp += Area( P[i], P[p], P[k] );
temp += Area( P[i], P[j], P[p] );
if ( temp == area ) {
flag = 0;
break;
}
}
if ( flag && Max < area ) {
a = i; b = j; c = k;
Max = area;
}
}
printf("%c%c%c\n",P[a].name,P[b].name,P[c].name);
}
return 0;
}