寻找三角形

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

分析:

  1. 判断三个点任意两边大于第三边;
  2. 判断三个点的颜色,要么全部一样,要么都不相同;
  3. 已知三边求三角形的面积公式: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;
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值