打赏

笔试题算法系列(七)百度寻找三角形

[编程题] 寻找三角形

时间限制: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

代码如下:
 1 import java.lang.Math;
 2 import java.util.Scanner;
 3 class Point{
 4     char c;
 5     int x;
 6     int y;
 7     int z;
 8 }
 9 public class Main{
10     //能构成三角形
11     public static boolean fitTri(double a, double b,double c){
12         if(a+b>c && a+c>b && b+c>a){
13             return true;
14         }else{
15             return false;
16         }
17     }
18     //颜色符合
19     public static boolean fitColor(char a, char b, char c){
20         if( a==b && a==c){
21             return true;
22         }else if(a!=b && a!=c && b!=c){
23             return true;
24         }else{
25             return false;
26         }
27     }
28     //计算边长
29     public static double calBorder(Point a, Point b){
30         double x = Math.abs(a.x-b.x);
31         double y = Math.abs(a.y-b.y);
32         double z = Math.abs(a.z-b.z);
33         return Math.sqrt(Math.pow(x,2)+Math.pow(y,2)+Math.pow(z,2));
34     }
35     //根据边长计算面积
36      public static double calAreaByBorder(double a, double b,double c){
37         double p = (a+b+c)/2;
38         double s = Math.sqrt(p*(p-a)*(p-b)*(p-c));
39         return s;
40     }
41     //计算三维三角形面积
42     public static double calAre(Point a, Point b,Point c){
43         double x = calBorder(a,b);
44         double y = calBorder(a,c);
45         double z = calBorder(b,c);
46         if(fitColor(a.c,b.c,c.c) && fitTri(x,y,z)){
47             return calAreaByBorder(x,y,z);
48         }else{
49             return -1;
50         }
51     }
52     public static void main(String[] args){
53         Scanner sc = new Scanner(System.in);
54         String[] line;
55         while(sc.hasNext()){
56             line = sc.nextLine().split(" ");
57             int n = Integer.parseInt(line[0]);
58             Point[] point = new Point[n];
59             for(int i=0; i<n; i++){
60                 point[i]= new Point();
61                 line = sc.nextLine().split(" ");
62                 point[i].c = line[0].charAt(0);
63                 point[i].x = Integer.parseInt(line[1]);
64                 point[i].y = Integer.parseInt(line[2]);
65                 point[i].z = Integer.parseInt(line[3]);
66             }
67             double maxArea = 0;
68             for(int i=0; i<n-2; i++){
69                 for(int j=i+1; j<n; j++){
70                     for(int k=j+1; k<n; k++){
71                         double area = calAre(point[i],point[j],point[k]);
72                         if(area!=-1){
73                             maxArea = Math.max(maxArea,area);
74                         }
75                     }
76                    
77                 }
78             }
79             System.out.println(String.format("%.5f",maxArea));
80         }
81         sc.close();
82     }
83 }

 

posted @ 2019-04-01 20:41  海米傻傻  阅读(478)  评论(0编辑  收藏  举报