[编程题]寻找三角形
三维空间中有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
输出
6.00000
我的解答
求三角形面积部分照搬的别人的,https://blog.csdn.net/hjq376247328/article/details/49465137?utm_source=blogxgwz8。
#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>
using namespace std;
class pix {
public:
pix(char cc, int xx, int yy, int zz) :c(cc),x(xx) ,y(yy),z(zz){}
char c;
int x;
int y;
int z;
};
double area(pix a, pix b, pix c) {
double area = 0;
double side[3];//存储三条边的长度;
side[0] = sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2) + pow(a.z - b.z, 2));
side[1] = sqrt(pow(a.x - c.x, 2) + pow(a.y - c.y, 2) + pow(a.z - c.z, 2));
side[2] = sqrt(pow(c.x - b.x, 2) + pow(c.y - b.y, 2) + pow(c.z - b.z, 2));
//不能构成三角形;
//if (side[0] + side[1] <= side[2] || side[0] + side[2] <= side[1] || side[1] + side[2] <= side[0]) return area;
//利用海伦公式。s=sqr(p*(p-a)(p-b)(p-c));
double p = (side[0] + side[1] + side[2]) / 2; //半周长;
area = sqrt(p * (p - side[0]) * (p - side[1]) * (p - side[2]));
return area;
}
int main()
{
vector<pix> pixs;
int n,x,y,z;
char c;
double areaz,maxArea = 0;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> c>>x>>y>>z;
pixs.push_back(pix(c, x, y, z));
}
for (int i = 0; i < n-2; i++) {
for (int j = i+1; j < n-1; j++) {
for (int k = j+1; k < n; k++) {
if (((pixs[i].c==pixs[j].c) && (pixs[j].c==pixs[k].c))||((pixs[i].c!=pixs[j].c) && (pixs[j].c!=pixs[k].c&& pixs[k].c!=pixs[i].c))){
areaz = area(pixs[i], pixs[j], pixs[k]);
maxArea = areaz > maxArea ? areaz : maxArea;
}
}
}
}
cout << fixed<<setprecision(5)<<maxArea;
return 0;
}