百度:寻找三角形

来源:互联网 发布:气象数据知识试题 编辑:程序博客网 时间:2024/06/05 06:00

三维空间中有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 0R 0 4 0R 0 0 3G 92 14 7G 12 16 8输出例子:6.00000

没有什么捷径,暴力求解:

  • 判断是否是一个颜色或者都不同
  • 是否可以组成三角形
  • 面积公式S=sqrt(p*(p-a)(p-b)(p-c)) ,p=(a+b+c)/2
  • 节点struct node{
    char c;
    int x;
    int y;
    int z;
    } 把node放在vector中
// sanjiaoxing.cpp.cpp : 定义控制台应用程序的入口点。//#include "cmath"#include "iostream"#include "map"#include "vector"#include "iomanip"using namespace std;//whether it is a triangle,parameters:three sidesbool whetherTriangle(double a, double b, double c) {    if ((a < (b + c)) && (b < (a + c)) && (c < (a + b)))    {        return true;    }    return false;}double triArea(double a, double b, double c){    double p = (a + b + c) / 2;    double area;    area = sqrt(p*(p - a)*(p - b)*(p - c));    return area;}struct Node {    char c;    int x, y, z;};int main(){    vector<Node> sidesMap;    int n;    cin >> n;    for (int i = 0; i < n; i++)    {        Node node;        cin >> node.c;        cin >> node.x;        cin >> node.y;        cin >> node.z;        sidesMap.push_back(node);    }    double maxArea = 0;    //Directly Calculating    for (int i = 0; i < n; i++)        for (int j = i + 1; j < n; j++)            for (int k = j + 1; k < n; k++)            {                if ((sidesMap[i].c == sidesMap[j].c) && (sidesMap[j].c ==  \                     sidesMap[k].c) || (sidesMap[i].c != sidesMap[j].c) &&  \                    (sidesMap[j].c != sidesMap[k].c)&& (sidesMap[i].c != sidesMap[k].c))                {                    //whether it is a triangle                    //three slides                    double a = sqrt((sidesMap[i].x - sidesMap[j].x)*(sidesMap[i].x - \                                sidesMap[j].x) + (sidesMap[i].y - sidesMap[j].y)*(sidesMap[i].y \                                - sidesMap[j].y) + (sidesMap[i].z - sidesMap[j].z) *(sidesMap[i].z \                                 - sidesMap[j].z));                    double b = sqrt(pow(sidesMap[i].x - sidesMap[k].x,2) + pow(sidesMap[i].y -\                                sidesMap[k].y,2) + pow(sidesMap[i].z - sidesMap[k].z,2));                    double c = sqrt(pow(sidesMap[j].x - sidesMap[k].x,2) + pow(sidesMap[j].y -\                                sidesMap[k].y,2) + pow(sidesMap[j].z - sidesMap[k].z,2));                    if (whetherTriangle(a, b, c))                    {                        //triangle area                        double area = triArea(a, b, c);                        if (maxArea < area)                            maxArea = area;                    }                }            }    cout.setf(ios::fixed);    cout << fixed << setprecision(5) << maxArea << endl;      return 0;}
原创粉丝点击