百度2017春招笔试真题编程题集合之寻找三角形

题目描述

三维空间中有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 import java.util.*;
 2 public class FindTriangle {
 3     public static void main(String[] args) {
 4         Scanner sc = new Scanner(System.in);
 5 
 6         int n = sc.nextInt();//点的个数
 7         sc.nextLine();
 8         String[] nums = new String[n];
 9         double temp = 0.0;
10         double area = Double.MIN_VALUE;
11         for (int i = 0; i < n; i++) {
12             nums[i] = sc.nextLine();
13         }
14 
15         char[] colors = new char[n];
16         for (int i = 0; i < n; i++) {
17             colors[i] = nums[i].split(" ")[0].charAt(0);
18         }
19         int[] x = new int[n];
20         for (int i = 0; i < n; i++) {
21             x[i] = Integer.parseInt(nums[i].split(" ")[1]);
22         }
23 
24         int[] y = new int[n];
25         for (int i = 0; i < n; i++) {
26             y[i] = Integer.parseInt(nums[i].split(" ")[2]);
27         }
28 
29         int[] z = new int[n];
30         for (int i = 0; i < n; i++) {
31             z[i] = Integer.parseInt(nums[i].split(" ")[3]);
32         }
33 
34         for (int i = 0; i < n; i++) {
35             for (int j = i + 1; j < n; j++) {
36                 for (int k = j + 1; k < n; k++) {
37                     //判断颜色是否全部相等或全部不等
38                     if (colors[i] == colors[j] && colors[j] == colors[k] ||
39                             colors[i] != colors[j] && colors[j] != colors[k] && colors[i] != colors[k]) {
40                         double a = Math.pow(Math.pow(Math.abs(x[i] - x[j]), 2) +
41                                 Math.pow(Math.abs(y[i] - y[j]), 2) +
42                                 Math.pow(Math.abs(z[i] - z[j]), 2), 0.5);
43                         double b = Math.pow(Math.pow(Math.abs(x[i] - x[k]), 2) +
44                                 Math.pow(Math.abs(y[i] - y[k]), 2) +
45                                 Math.pow(Math.abs(z[i] - z[k]), 2), 0.5);
46                         double c = Math.pow(Math.pow(Math.abs(x[k] - x[j]), 2) +
47                                 Math.pow(Math.abs(y[k] - y[j]), 2) +
48                                 Math.pow(Math.abs(z[k] - z[j]), 2), 0.5);
49 
50                         double p = (a + b + c) / 2;
51                       //海伦公式求空间三角形面积
52                         temp = Math.pow(p * (p - a) * (p - b) * (p - c), 0.5);
53                         if (area < temp) {
54                             area = temp;
55                         }
56                     }
57                 }
58             }
59         }
60         System.out.printf("%.5f", area);
61     }
62 }

 

转载于:https://www.cnblogs.com/lfeng1205/p/6804234.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值