笔试题算法系列(七)百度寻找三角形
[编程题] 寻找三角形
时间限制: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 }