[编程题] 寻找三角形
时间限制:1秒
空间限制:32768K
三维空间中有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
package com.Main; import java.util.Scanner; public class trangle { // 三维空间中有N个点,每个点可能是三种颜色的其中之一,三种颜色分别是红绿蓝,分别用'R', 'G', 'B'表示。 // 现在要找出三个点,并组成一个三角形,使得这个三角形的面积最大。 // 但是三角形必须满足:三个点的颜色要么全部相同,要么全部不同。 /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub // 5 // R 0 0 0 // R 0 4 0 // R 0 0 3 // G 92 14 7 // G 12 16 8 Scanner sc=new Scanner(System.in); //总数N int N=sc.nextInt(); String[][] arr=new String[N][4] ; //开始读入数据 //N行4列 for (int i = 0; i < N; i++) { for (int j = 0; j < 4; j++) { arr[i][j]=sc.next(); } } double temp=0.0; double max=0.0; //数据读入完成 //找出三个点,三个点颜色相同或全部不同,计算三角形面积 for (int i = 0; i < arr.length; i++) { for (int j = i+1; j < arr.length; j++) { for (int k = j+1; k < arr.length; k++) { //1、颜色相同 //2、颜色不同 if((arr[i][0].equals(arr[j][0])&&arr[j][0].equals(arr[k][0])&&arr[i][0].equals(arr[k][0])) ||((!arr[i][0].equals(arr[j][0]))&&(!arr[j][0].equals(arr[k][0]))&&(!arr[i][0].equals(arr[k][0])))){ //计算三角形面积 //传入数组arr 以及 适合的点i,j,k temp=jiusuantrangle(arr,i,j,k); } if(temp>max){ max=temp; } } } } System.out.printf("%.5f", max); } //计算三角形面积 public static double jiusuantrangle(String[][] arr,int i,int j,int k){ double a = Math.pow(Math.pow(Math.abs(Integer.parseInt(arr[i][1]) - Integer.parseInt(arr[j][1])), 2) + Math.pow(Math.abs(Integer.parseInt(arr[i][2]) - Integer.parseInt(arr[j][2])), 2) + Math.pow(Math.abs(Integer.parseInt(arr[i][3]) - Integer.parseInt(arr[j][3])), 2), 0.5); double b = Math.pow(Math.pow(Math.abs(Integer.parseInt(arr[j][1]) - Integer.parseInt(arr[k][1])), 2) + Math.pow(Math.abs(Integer.parseInt(arr[j][2]) - Integer.parseInt(arr[k][2])), 2) + Math.pow(Math.abs(Integer.parseInt(arr[j][3]) - Integer.parseInt(arr[k][3])), 2), 0.5); double c = Math.pow(Math.pow(Math.abs(Integer.parseInt(arr[i][1]) - Integer.parseInt(arr[k][1])), 2) + Math.pow(Math.abs(Integer.parseInt(arr[i][2]) - Integer.parseInt(arr[k][2])), 2) + Math.pow(Math.abs(Integer.parseInt(arr[i][3]) - Integer.parseInt(arr[k][3])), 2), 0.5); double p = (a + b + c) / 2; double temp = Math.pow(p * (p - a) * (p - b) * (p - c), 0.5); return temp; } }