寻找三角形

来源:互联网 发布:淘宝硅胶充气娃娃 编辑:程序博客网 时间:2024/05/22 00:50

百度笔试

1、问题描述:

三维空间中有N个点,每个点可能是三种颜色的其中之一,三种颜色分别是红绿蓝,分别用R、G、B表示。
现在要找出三个点,并组成一个三角形,使得三角形的面积最大。三角形必须满足:三个点颜色要么全部相同,要么全部不同。

输入描述:

首先输入一个正整数N(N<50)三维坐标系内的点的个数。接下来N行,每一行输入 c x y z,c为R、G、B其中一个。x,y,z,为坐标。(坐标0-999的整数)
输出描述:

最大的三角形面积,保留5位小数。

样例输入:

5R 0 0 0 R 0 4 0 R 0 0 3 G 92 14 7G 12 16 8

样例输出:

6.00000

2、分析

暴力枚举,判断满足条件的三角形,然后计算机三角形面积进行比较。三角形的公式可以使用叉积公式或海伦公式。

本题因为是空间的点,使用叉积公式,即使用向量乘积计算比海伦公式方便很多。

海伦公式:S=√[p(p-a)(p-b)(p-c)]其中p=(a+b+c)/2。

叉积公式:a = a1i + a2j + a3k = [a1, a2, a3]
                  b = b1i + b2j + b3k = [b1, b2, b3]

s=|a × b| /2= √(a2b3 − a3b2)^2+(a3b1 − a1b3)^2+(a1b2 − a2b1)^2 /2向量的叉积为以a、b为边平行四边形的面积,三角形即为一半。

3、步骤

1)输入

2)循环枚举

3)判断条件,成立计算面积

4)比较得出最大面积值

5)按格式输出

4、实现代码

#include <bits/stdc++.h>using namespace std;#define mul(x) ((x)*(x))char type[55];double x[55],y[55],z[55];int main(){int n;cin>>n;for(int i=0;i<n;i++)cin>>type[i]>>x[i]>>y[i]>>z[i];double ans=0.0;for(int i=0;i<n;i++){for(int j=0;j<i;j++){for(int k;k<j;k++){//循环枚举int ok=0;if(type[i]==type[j] || type[i]==type[k]) ok=1;//颜色相同if(type[i]!=type[j] && type[i]!=type[k] && type[j]!=type[k]) ok =1;//颜色都不相同if(!ok) continue;//不符合跳过double ux=x[j]-x[i],uy=y[j]-y[i],uz=z[j]-z[i];//两个向量double vx=x[k]-x[i],vy=y[k]-y[i],vz=z[k]-z[i];double area=sqrt(mul(ux*vy-vx*uy)+mul(uy*vz-vy*uz)+mul(uz*vx-ux*vz));ans=ans>area*0.5?ans:area*0.5;//值比较}}}printf("%.5lf\n",ans);return 0;}


原创粉丝点击