[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位小数。输入例子:
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));
}
};
现在要找出三个点,并组成一个三角形,使得这个三角形的面积最大。
但是三角形必须满足:三个点的颜色要么全部相同,要么全部不同。
输入描述:
首先输入一个正整数N三维坐标系内的点的个数.(N <= 50)
接下来N行,每一行输入 c x y z,c为’R’, ‘G’, ‘B’ 的其中一个。x,y,z是该点的坐标。(坐标均是0到999之间的整数)输出描述:
输出一个数表示最大的三角形面积,保留5位小数。输入例子:
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));
}
};
相关文章推荐
- poj 2079 Triangle 凸包+旋转卡壳 求最大三角形面积
- Codeforces Round #358 (Div. 2) E 计算几何 旋转卡壳求最大三角形面积
- poj 2079 求一个平面所有点构成最大三角形的面积
- poj1948(经典问题-二维背包 求面积最大三角形)
- POJ 2079 Triangle(凸包+旋转卡壳,求最大三角形面积)
- 百度2017春招<空间中最大三角形面积的问题>
- poj2079 求最大的三角形面积
- POJ 2079 Triangle(凸包+旋转卡壳,求最大三角形面积)
- HDU 2202 最大三角形(求凸包中最大三角形面积)
- 【动态规划】UVa 1331 最大面积最小三角形剖分
- 二维凸包模板(凸包重心,周长,面积,直径,最大三角形,最小环绕矩形)
- 二维凸包模板(凸包重心,周长,面积,直径,最大三角形,最小环绕矩形)
- 求三角形最大面积(DP)
- (hdu step 7.1.6)最大三角形(凸包的应用——在n个点中找到3个点,它们所形成的三角形面积最大)
- poj2079(*凸包内最大三角形面积)
- poj2079凸包求最大三角形面积
- [计算几何]POJ2079 求点集中面积最大的三角形
- (hdu step 7.1.6)最大三角形(凸包的应用——在n个点中找到3个点,它们所形成的三角形面积最大)
- 区间DP 最大面积最小的三角形划分
- POJ 2079 Triangle(凸包_旋转卡壳之最大三角形面积)