三维空间中有N个点,每个点可能是三种颜色的其中之一,三种颜色分别是红绿蓝,分别用'R', 'G', 'B'表示。 现在要找出三个点,并组成一个三角形,使得这个三角形的面积最大。 但是三角形必须满足:三个点的颜色要么全部相同,要么全部不同。
输入描述:
首先输入一个正整数N三维坐标系内的点的个数.(N <= 50)
接下来N行,每一行输入 c x y z,c为'R', 'G', 'B' 的其中一个。x,y,z是该点的坐标。(坐标均是0到999之间的整数)
输出描述:
输出一个数表示最大的三角形面积,保留5位小数。
输入例子1:
5
R 0 0 0
R 0 4 0
R 0 0 3
G 92 14 7
G 12 16 8
输出例子1:
6.00000
#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>
using namespace std;
//要点 能不能组成三角行,判断是不是三角形 ,求面积
struct point
{
char color;
int x;
int y;
int z;
};
bool IsColor(point a, point b, point c)
{
if (a.color == b.color && b.color == c.color)
return true;
if (a.color != b.color && b.color != c.color && a.color != c.color)
return true;
return false;
}
double Distance(point a, point b)
{
double Dis = 0.0;
Dis = sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y) + (a.z - b.z)*(a.z - b.z));
return Dis;
}
bool IsTri(point a, point b, point c)
{
double XD, YD, ZD;
XD = Distance(a, b);
YD = Distance(a, c);
ZD = Distance(b, c);
if (YD - ZD < XD < YD + ZD && XD - ZD < YD < XD + ZD && YD + XD < ZD < YD + XD)
return true;
return false;
}
double Area(double a, double b, double c)
{
double sum = (a + b + c) / 2.0;
double S = sqrt(sum*(sum - a)*(sum - b)*(sum - c));
return S;
}
int main()
{
point pos[51];
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> pos[i].color >> pos[i].x >> pos[i].y >> pos[i].z;
}
double maxS = 0.0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
for (int k = 0; k < n; k++)
{
if (i != j && j != k && k != i)
{
if (IsColor(pos[i], pos[j], pos[k]))
{
if (IsTri(pos[i], pos[j], pos[k]))
{
maxS = max(maxS, Area(Distance(pos[i], pos[j]), Distance(pos[i], pos[k]), Distance(pos[j], pos[k])));
}
}
}
}
}
}
//cout.setf(ios::fixed);
//cout << maxS << setprecision(5) << endl;
cout.setf(ios::fixed);
cout<<setprecision(5)<< maxS << endl;
//system("pause");
return 0;
}