您的位置:首页 > 其它

[alg] 求最大的三角形面积

2018-03-04 20:41 501 查看
三维空间中有N个点,每个点可能是三种颜色的其中之一,三种颜色分别是红绿蓝,分别用’R’, ‘G’, ‘B’表示。 
现在要找出三个点,并组成一个三角形,使得这个三角形的面积最大。 
但是三角形必须满足:三个点的颜色要么全部相同,要么全部不同。 
输入描述: 
首先输入一个正整数N三维坐标系内的点的个数.(N <= 50) 
接下来N行,每一行输入 c x y z,c为’R’, ‘G’, ‘B’ 的其中一个。x,y,z是该点的坐标。(坐标均是0到999之间的整数)输出描述: 
输出一个数表示最大的三角形面积,保留5位小数。输入例子: 

R 0 0 0 
R 0 4 0 
R 0 0 3 
G 92 14 7 
G 12 16 8输出例子: 
6.00000

struct Point {
public:
char color;
int x, y, z;

public:
Point(char c, int x, int y, int z) : color(c), x(x), y(y), z(z) {}
};

class Solution {
public:
double MaxTriangleArea(vector<Point> &pts) {
vector<Point> rset, gset, bset;

for (auto &pt : pts) {
if (pt.color == 'R') {
rset.push_back(pt);
} else if (pt.color == 'G') {
gset.push_back(pt);
} else {
bset.push_back(pt);
}
}

double MaxArea = 0;

MaxArea = max(MaxArea, MaxTriangleAreaSameColor(rset));
MaxArea = max(MaxArea, MaxTriangleAreaSameColor(gset));
MaxArea = max(MaxArea, MaxTriangleAreaSameColor(bset));

for (int i = 0; i < rset.size(); i++) {
for (int j = 0; j < gset.size(); j++) {
for (int k = 0; k < bset.size(); k++) {
MaxArea = max(MaxArea, TriangleArea(rset[i], gset[j], bset[k]));
}
}
}

return MaxArea;
}
private:
double MaxTriangleAreaSameColor(vector<Point> &set) {
double MaxArea = 0;

for (int i = 0; i < set.size(); i++) {
for (int j = i + 1; j < set.size(); j++) {
for (int k = j + 1; k < set.size(); k++) {

4000
MaxArea = max(MaxArea, TriangleArea(set[i], set[j], set[k]));
}
}
}

return MaxArea;
}

double Distance(Point &a, Point &b) {
return sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2) + pow(a.z - b.z, 2));
}

double TriangleArea(Point &a, Point &b, Point &c) {
double x = Distance(a, b), y = Distance(a, c), z = Distance(b, c);
double p = (x + y + z) / 2;

return sqrt(p * (p - x) * (p - y) * (p - z));
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: