海伦公式: S=p∗(p−a)∗(p−b)∗(p−c)−−−−−−−−−−−−−−−−−−−−−−√ ,其中 a,b,c 是三角形边长, p <script type="math/tex" id="MathJax-Element-109">p</script>是三角形周长的一半。
思路:枚举三角形的三个顶点,判断是否满足三个点的颜色要么全部相同,要么全部不同。
AC代码
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
const int maxn = 50+5;
struct point{
char col;
double x, y, z;
}a[maxn];
double getLen(int i, int j) {
int p = (a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y)+(a[i].z-a[j].z)*(a[i].z-a[j].z);
return sqrt(p);
}
double getArea(int i, int j, int k) {
double a = getLen(i, j);
double b = getLen(i, k);
double c = getLen(j, k);
double p = (a+b+c) / 2;
double area = sqrt(p*(p-a)*(p-b)*(p-c));
return area;
}
int main() {
int n;
while(scanf("%d", &n) == 1) {
for(int i = 0; i < n; i++) {
getchar();
scanf("%c %lf %lf %lf", &a[i].col, &a[i].x, &a[i].y, &a[i].z);
}
double ans = 0;
for(int i = 0; i < n; i++)
for(int j = i+1; j < n; j++)
for(int k = j+1; k < n; k++) {
if((a[i].col == a[j].col && a[i].col == a[k].col)) {
ans = max(ans, getArea(i, j, k));
}
if(a[i].col != a[j].col && a[i].col != a[k].col && a[j].col != a[k].col) {
ans = max(ans, getArea(i, j, k));
}
}
printf("%.5f\n", ans);
}
return 0;
}
如有不当之处欢迎指出!