三维空间中有N个点,每个点可能是三种颜色的其中之一,三种颜色分别是红绿蓝,分别用’R’, ‘G’, 'B’表示。
现在要找出三个点,并组成一个三角形,使得这个三角形的面积最大。
但是三角形必须满足:三个点的颜色要么全部相同,要么全部不同。
思路:
问题1:遍历所有可能的3个点
for(int i = 0; i < n; i++)
for(int j = i + 1; j < n; j++)
for(int k = j + 1; k < n; k++)
问题2:判断3个点是否能组成三角形
double a = dis(i, j); //计算两点距离
double b = dis(i, k);
double c = dis(k, j);
if(a < (b + c) && b < (a + c) && c < (a + b))
{
return true;
}
return false;
问题3:判断颜色是否相同或全不同
if(V[i].c == V[j].c && V[j].c == V[k].c)
{
return true;
}
else if(V[i].c != V[j].c &&V[i].c != V[k].c&&V[k].c != V[j].c)
{
return true;
}
return false;
问题4:计算三角形面积 (海伦公式 )
doublea = L3(i, j);
doubleb = L3(i, k);
doublec = L3(k, j);
doublep = (a + b + c) / 2;
return sqrt(p * (p - a) * (p - b) * (p - c));
package baidu;
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
static class Point{
//空间点的颜色,坐标
char color;
int x;
int y;
int z;
}
@SuppressWarnings("resource")
public static void main(String[] args) {
ArrayList<Point> list = new ArrayList<>();
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
scanner.nextLine();
for(int i = 0; i < n; i++)
{
Point p = new Point();
String[] arr = scanner.nextLine().split(" ");
//获取到字符
p.color = arr[0].charAt(0);
//获取到字符转为数字
p.x = Integer.parseInt(arr[1]);
p.y = Integer.parseInt(arr[2]);
p.z = Integer.parseInt(arr[3]);
list.add(p);
}
double maxArea = 0;
double area = 0;
for(int i = 0; i < n; i++)
{
for(int j = i+1; j < n; j++)
{
for(int k = j+1; k < n; k++)
{
Point A = list.get(i);
Point B = list.get(j);
Point C = list.get(k);
if(isSan(A,B,C)&&colorIsMathed(A,B,C)){
area = getArea(A,B,C);
}
if(area > maxArea)
{
maxArea = area;
}
}
}
}
System.out.format("%.5f", maxArea);
}
//计算面积,海伦公式
public static double getArea(Point A, Point B, Point C) {
double a = distance(A, B);
double b = distance(A, C);
double c = distance(B, C);
double p = (a + b + c) / 2;
return Math.sqrt(p * (p - a) * (p - b) * (p - c));
}
//计算颜色是否符合
public static boolean colorIsMathed(Point A, Point B, Point C) {
//三色都一样
if(A.color==B.color&&A.color==C.color)
{
return true;
}
//三色都不一样
else if(A.color!=B.color && A.color!=C.color && B.color!=C.color)
return true;
else {
return false;
}
}
//判断是否能构成三角形
public static boolean isSan(Point A, Point B, Point C) {
double a = distance(A, B);
double b = distance(A, C);
double c = distance(B, C);
if (a<(b+c) && b<(a+c) && c<(a+b)
&& a>Math.abs(b-c) && b>Math.abs(a-c) && c>Math.abs(a-b)){
return true;
}
return false;
}
//计算两点间的距离
public static double distance(Point A, Point B){
return Math.sqrt((A.x - B.x)*(A.x - B.x)+(A.y - B.y)*(A.y - B.y)+(A.z - B.z)*(A.z - B.z));
}
}