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;
    }


}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM