zoukankan      html  css  js  c++  java
  • java

    链接:https://www.nowcoder.com/questionTerminal/c3f8d56fc9be4d55a36b0cf786c83ece?toCommentId=5241474
    来源:牛客网

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

    输出

    6.00000

    海伦公式:

    • formula
    公式描述:
    公式中a,b,c分别为三角形三边长,p为半周长,S为三角形的面积。

    然后3重循环穷举遍历就好了-。-

    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
    
            int num = sc.nextInt();
    
            int[] px = new int[num];
            int[] py = new int[num];
            int[] pz = new int[num];
            char[] colourArr = new char[num];
    
    
            for (int i = 0; i < num; i++) {
                colourArr[i] = sc.next().charAt(0);
                px[i] = sc.nextInt();
                py[i] = sc.nextInt();
                pz[i] = sc.nextInt();
            }
    
            double maxArea = 0;
    
            for(int i = 0; i < num; i++){
                for(int j = 0; j < num; j++) {
                    if(j == i){
                        continue;
                    }
    
                    for(int k = 0; k < num; k++){
                        if(k == i || k == j){
                            continue;
                        }
                        if(colourArr[k] == colourArr[i] && colourArr[k] == colourArr[j]){
                            //3个相同颜色的点
                            double area = getArea(px[i], py[i], pz[i], px[j], py[j], pz[j], px[k], py[k], pz[k]);
                            if(area > maxArea){
                                maxArea = area;
                            }
                        }
                        else if(colourArr[k] != colourArr[i] && colourArr[k] != colourArr[j] && colourArr[i] != colourArr[j]){
                            //3个不同颜色的点
                            double area = getArea(px[i], py[i], pz[i], px[j], py[j], pz[j], px[k], py[k], pz[k]);
                            if(area > maxArea){
                                maxArea = area;
                            }
                        }
    
                    }
                }
            }
    
    
            System.out.println(String.format("%.5f", maxArea));
        }
    
    
        //海伦公式
        //(p=(a+b+c)/2)
        //S=sqrt[p(p-a)(p-b)(p-c)]
    
    
        public static double getArea(int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3){
            double a = Math.sqrt( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) + (z1-z2) * (z1-z2) );
            double b = Math.sqrt( (x2-x3) * (x2-x3) + (y2-y3) * (y2-y3) + (z2-z3) * (z2-z3) );
            double c = Math.sqrt( (x1-x3) * (x1-x3) + (y1-y3) * (y1-y3) + (z1-z3) * (z1-z3) );
    
            double p = (a + b + c) / 2;
    
            double area = Math.sqrt( p * (p - a) * (p - b) * (p - c) );
    
            return area;
        }
    
    
    }
  • 相关阅读:
    asp.net中合并DataGrid行
    将Asp.Net页面输出到EXCEL里去····
    清空Sql数据库日志等操作
    opengl 教程(14) 摄像机控制(1)
    awk使用技巧
    opengl 教程(10) index draw
    opengl 教程(12) 投影矩阵
    opengl 教程(9) 顶点属性插值
    opengl 教程(15) 摄像机控制(2)
    opengl 教程(11) 平移/旋转/缩放
  • 原文地址:https://www.cnblogs.com/clamp7724/p/12247675.html
Copyright © 2011-2022 走看看