百度笔试-寻找三角形

时间限制: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));
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值