时间限制: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
思路:
此题逻辑实现比较简单,我们只需要判断三个点是否满足颜色全部相同或者全不相同条件,在判断三个点是否能够构成三角形,如果能够,则计算该三角形的面积(题目中只给出三角形三个点的坐标,因此我们可以应用海伦公式计算三角形面积),接着再判断其他的点是否满足条件,最后选取面积最大的三个点所构成的三角形即可;
代码如下:
import java.util.Scanner;
public class Main{
static class node {
int c;
int x, y, z;
public node(int c, int x, int y, int z) {
super();
this.c = c;
this.x = x;
this.y = y;
this.z = z;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
node[] nodes = new node[n];
for (int i = 0; i < n; i++) {
String str = sc.next();
int x = sc.nextInt();
int y = sc.nextInt();
int z = sc.nextInt();
nodes[i] = new node(str.charAt(0) - 'A', x, y, z);
}
System.out.printf("%.5f", run(nodes));
}
}
public static double run(node[] list) {
int n = list.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(list, i, j, k)) {
if (isSan(list, i, j, k)) {
double temp = area(list, i, j, k);
max = Math.max(max, temp);
}
}
}
}
}
return max;
}
/**
*
* @param list
* @param x 第x点
* @param y 第y点
* @param z 第z点
* @return 是否能够构成三角形
*/
public static boolean isSan(node[] list, int x, int y, int z) {
double a = edge(list, x, y);
double b = edge(list, x, z);
double c = edge(list, y, z);
if ((a + b) > c && (a + c) > b && (b + c) > a)
return true;
else
return false;
}
/**
*
* @param list
* @param x 第x点
* @param y 第y点
* @return 边的长度
*/
public static double edge(node[] list, int x, int y) {
double res = Math.sqrt(
(list[x].x - list[y].x) * (list[x].x - list[y].x) + (list[x].y - list[y].y) * (list[x].y - list[y].y)
+ (list[x].z - list[y].z) * (list[x].z - list[y].z));
return res;
}
/**
*
* @param list
* @param x 第x个点
* @param y 第y个点
* @param z 第z个点
* @return 三个点是否满足颜色全部相同或者全不相同条件
*/
public static boolean isSameColor(node[] list, int x, int y, int z) {
if (list[x].c == list[y].c && list[y].c == list[z].c)
return true;
else if (list[x].c != list[y].c && list[x].c != list[z].c && list[y].c != list[z].c)
return true;
else {
return false;
}
}
/**
*
* @param list
* @param x 第x个点
* @param y 第y个点
* @param z 第z个点
* @return 三个点所构成三角形的面积
*
* 海伦计算三角形面积公式 S = (p*(p-a)*(p-b)*(p-c)) p=(a+b+c)/2
*/
public static double area(node[] list, int x, int y, int z) {
double a = edge(list, x, y);
double b = edge(list, x, z);
double c = edge(list, y, z);
double avr = (a + b + c) / 2;
return Math.sqrt(avr * (avr - a) * (avr - b) * (avr - c));
}
}

989

被折叠的 条评论
为什么被折叠?



