[编程题] 寻找三角形
时间限制: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
思路:
暴力枚举,海伦公式求面积
#include<iostream>
#include<vector>
#include <cmath>
#include <algorithm>
using namespace std;
struct node{
double x,y,z;
}r[55],g[55],b[55];
double dis(node a,node b){
return 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) );
}
double solve(node a,node b,node c){
double ab=dis(a,b);
double ac=dis(a,c);
double bc=dis(b,c);
double p=ab+ac+bc;
p/=2;
return sqrt( p*(p-ab)*(p-ac)*(p-bc));
}
int main(){
int n;
cin>>n;
int cntr=0,cntg=0,cntb=0;
char s[5];
for(int i=1;i<=n;i++)
{
cin>>s;
if(s[0]=='R')
cntr++,cin>>r[cntr].x>>r[cntr].y>>r[cntr].z;
else if(s[0]=='G')
cntg++,cin>>g[cntg].x>>g[cntg].y>>g[cntg].z;
else cntb++,cin>>b[cntb].x>>b[cntb].y>>b[cntb].z;
}
double maxx=0;
for(int i=1;i<=cntr;i++)
for(int j=i+1;j<=cntr;j++)
for(int k=j+1;k<=cntr;k++)
maxx=max(maxx,solve(r[i],r[j],r[k]));
for(int i=1;i<=cntg;i++)
for(int j=i+1;j<=cntg;j++)
for(int k=j+1;k<=cntg;k++)
maxx=max(maxx,solve(g[i],g[j],g[k]));
for(int i=1;i<=cntb;i++)
for(int j=i+1;j<=cntb;j++)
for(int k=j+1;k<=cntb;k++)
maxx=max(maxx,solve(b[i],b[j],b[k]));
for(int i=1;i<=cntr;i++)
for(int j=1;j<=cntg;j++)
for(int k=1;k<=cntb;k++)
maxx=max(maxx,solve(r[i],g[j],b[k]));
printf("%.5lf\n",maxx);
}