[编程题] 寻找三角形

xiaoxiao2021-02-28  66

三维空间中有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; }

转载请注明原文地址: https://www.6miu.com/read-30581.html

最新回复(0)