三维空间中有N个点,每个点可能是三种颜色的其中之一,三种颜色分别是红绿蓝,分别用’R’, ‘G’, ‘B’表示。
现在要找出三个点,并组成一个三角形,使得这个三角形的面积最大。
但是三角形必须满足:三个点的颜色要么全部相同,要么全部不同。
输入描述:
首先输入一个正整数N三维坐标系内的点的个数.(N <= 50)
接下来N行,每一行输入 c x y z,c为’R’, ‘G’, ‘B’ 的其中一个。x,y,z是该点的坐标。(坐标均是0到999之间的整数)
输出描述:
输出一个数表示最大的三角形面积,保留5位小数。
输入例子:
5
R 0 0 0
R 0 4 0
R 0 0 3
G 92 14 7
G 12 16 8
输出例子:
6.00000
分析:
- 判断三个点任意两边大于第三边;
- 判断三个点的颜色,要么全部一样,要么都不相同;
- 已知三边求三角形的面积公式:area = Math.sqrt(q*(q-a)(q-b)(q-c))
package Exam;
import java.awt.geom.Area;
import java.util.Scanner;
public class searchMaxTriangle {
static class Node{
int c;
int x,y,z;
public Node(int c, int x,int y,int z){
this.c = c;
this.x = x;
this.y = y;
this.z = z;
}
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
while(in.hasNext()){
int n = in.nextInt();
Node nodes[] = new Node[n];
for(int i=0;i<n;i++){
String color = in.next();
int x = in.nextInt();
int y = in.nextInt();
int z = in.nextInt();
nodes[i] = new Node(color.charAt(0)-'A',x, y, z);
}
System.out.printf("%.5f",getResult(nodes));
}
}
private static double getResult(Node[] nodes) {
// TODO Auto-generated method stub
int n = nodes.length;
double max = 0.0;
for(int i=0;i<n-2;i++){
for(int j=i+1;j<n-1;j++){
for(int k=j+1;k<n;k++){
if(isSameColor(nodes,i,j,k)){
if(iscompositionTriangle(nodes,i,j,k)){
double b = Area(nodes,i,j,k);
max = Math.max(max, b);
}
}
}
}
}
return max;
}
private static double Area(Node[] nodes, int x, int y, int z) {
// TODO Auto-generated method stub
double a = edge(nodes,x,y);
double b = edge(nodes,x,z);
double c = edge(nodes,y,z);
double p = (a+b+c)/2;
double area = Math.sqrt(p*(p-a)*(p-b)*(p-c));
return area;
}
private static boolean iscompositionTriangle(Node[] nodes, int x, int y, int z) {
// TODO Auto-generated method stub
double a = edge(nodes,x,y);
double b = edge(nodes,x,z);
double c = edge(nodes,y,z);
if((a+b)>c && (a+c)>b && (b+c)>a){
return true;
}else {
return false;
}
}
private static double edge(Node[] nodes, int x, int z) {
// TODO Auto-generated method stub
double res =Math.sqrt(Math.pow(nodes[x].x-nodes[z].x,2)+Math.pow(nodes[x].y-nodes[z].y,2)+Math.pow(nodes[x].z-nodes[z].z,2));
return res;
}
private static boolean isSameColor(Node[] nodes, int x, int y, int z) {
// TODO Auto-generated method stub
if(nodes[x].c==nodes[y].c && nodes[y].c==nodes[z].c){
return true;
}else if(nodes[x].c!=nodes[y].c && nodes[x].c!=nodes[z].c && nodes[y].c!=nodes[z].c){
return true;
}else {
return false;
}
}
}