zoukankan      html  css  js  c++  java
  • 笔试题算法系列(七)百度寻找三角形

    [编程题] 寻找三角形

    时间限制:1秒

    空间限制:32768K

    三维空间中有N个点,每个点可能是三种颜色的其中之一,三种颜色分别是红绿蓝,分别用'R', 'G', 'B'表示。 
    现在要找出三个点,并组成一个三角形,使得这个三角形的面积最大。
    但是三角形必须满足:三个点的颜色要么全部相同,要么全部不同。
    输入描述:
    首先输入一个正整数N三维坐标系内的点的个数.(N <= 50) 
    接下来N行,每一行输入 c x y z,c为'R', 'G', 'B' 的其中一个。x,y,z是该点的坐标。(坐标均是0到999之间的整数)
    输出描述:
    输出一个数表示最大的三角形面积,保留5位小数。
    输入例子1:
    5
    R 0 0 0
    R 0 4 0
    R 0 0 3
    G 92 14 7
    G 12 16 8
    输出例子1:
    6.00000

    代码如下:
     1 import java.lang.Math;
     2 import java.util.Scanner;
     3 class Point{
     4     char c;
     5     int x;
     6     int y;
     7     int z;
     8 }
     9 public class Main{
    10     //能构成三角形
    11     public static boolean fitTri(double a, double b,double c){
    12         if(a+b>c && a+c>b && b+c>a){
    13             return true;
    14         }else{
    15             return false;
    16         }
    17     }
    18     //颜色符合
    19     public static boolean fitColor(char a, char b, char c){
    20         if( a==b && a==c){
    21             return true;
    22         }else if(a!=b && a!=c && b!=c){
    23             return true;
    24         }else{
    25             return false;
    26         }
    27     }
    28     //计算边长
    29     public static double calBorder(Point a, Point b){
    30         double x = Math.abs(a.x-b.x);
    31         double y = Math.abs(a.y-b.y);
    32         double z = Math.abs(a.z-b.z);
    33         return Math.sqrt(Math.pow(x,2)+Math.pow(y,2)+Math.pow(z,2));
    34     }
    35     //根据边长计算面积
    36      public static double calAreaByBorder(double a, double b,double c){
    37         double p = (a+b+c)/2;
    38         double s = Math.sqrt(p*(p-a)*(p-b)*(p-c));
    39         return s;
    40     }
    41     //计算三维三角形面积
    42     public static double calAre(Point a, Point b,Point c){
    43         double x = calBorder(a,b);
    44         double y = calBorder(a,c);
    45         double z = calBorder(b,c);
    46         if(fitColor(a.c,b.c,c.c) && fitTri(x,y,z)){
    47             return calAreaByBorder(x,y,z);
    48         }else{
    49             return -1;
    50         }
    51     }
    52     public static void main(String[] args){
    53         Scanner sc = new Scanner(System.in);
    54         String[] line;
    55         while(sc.hasNext()){
    56             line = sc.nextLine().split(" ");
    57             int n = Integer.parseInt(line[0]);
    58             Point[] point = new Point[n];
    59             for(int i=0; i<n; i++){
    60                 point[i]= new Point();
    61                 line = sc.nextLine().split(" ");
    62                 point[i].c = line[0].charAt(0);
    63                 point[i].x = Integer.parseInt(line[1]);
    64                 point[i].y = Integer.parseInt(line[2]);
    65                 point[i].z = Integer.parseInt(line[3]);
    66             }
    67             double maxArea = 0;
    68             for(int i=0; i<n-2; i++){
    69                 for(int j=i+1; j<n; j++){
    70                     for(int k=j+1; k<n; k++){
    71                         double area = calAre(point[i],point[j],point[k]);
    72                         if(area!=-1){
    73                             maxArea = Math.max(maxArea,area);
    74                         }
    75                     }
    76                    
    77                 }
    78             }
    79             System.out.println(String.format("%.5f",maxArea));
    80         }
    81         sc.close();
    82     }
    83 }
  • 相关阅读:
    Linux基础命令(二)
    Linux基础命令(一)
    安装Centos 7操作系统
    网络基础之网络协议
    操作系统简介
    计算机硬件知识
    VS快捷键
    VB.NET 编程元素支持更改总结
    VB.Net中确认退出对话框的实现
    VB定义变量
  • 原文地址:https://www.cnblogs.com/haimishasha/p/10638792.html
Copyright © 2011-2022 走看看