寻找三角形
时间限制:1秒
空间限制:32768K
三维空间中有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
解题思路:
1.遍历所有可能的3个点,判断颜色是否相同或全不同
2.判断3个点是否能构成三角形
3.计算三角形面积(海伦公式)
4.输出最大面积
#include<iostream> #include<cstdio> #include<math.h> using namespace std; struct Point { char c; int x,y,z; }; double getTriangle(Point A,Point B,Point C) { double a=sqrt(pow(A.x-B.x,2)+pow(A.y-B.y,2)+pow(A.z-B.z,2)); double b=sqrt(pow(A.x-C.x,2)+pow(A.y-C.y,2)+pow(A.z-C.z,2)); double c=sqrt(pow(B.x-C.x,2)+pow(B.y-C.y,2)+pow(B.z-C.z,2)); if(a+b>c&&a+c>b&&b+c>a) { double p=(a+b+c)/2; return sqrt(p*(p-a)*(p-b)*(p-c)); } else return -1; } int main() { int n,i,j,k; Point p[50]; double minS=0,s; scanf("%d",&n); for(i=0;i<n;i++) cin>>p[i].c >>p[i].x >>p[i].y >>p[i].z; for(i=0;i<n;i++) for(j=i+1;j<n;j++) for(k=j+1;k<n;k++) { if((p[i].c==p[j].c&&p[j].c==p[k].c&&p[i].c==p[k].c)||((p[i].c!=p[j].c)&&(p[i].c!=p[k].c)&&(p[j].c!=p[k].c))) s=getTriangle(p[i],p[j],p[k]); if(minS<s) minS=s; } printf("%.5lf\n",minS); return 0; }