算法---求空间中多个点中,组成面积最大的三个点

三维空间中有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));
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值