3、尋找三角形--百度2017春招


[編程題] 尋找三角形
時間限制: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
 
解題思路:本題先定義一個計算三維空間三角形面積的函數
1)定義結構體,存儲每個點的信息
2)遍歷所有點,選取三個,求出面積
3)求出面積后比較三個點的顏色全部相同或者全部不同,如果滿足,且面積大於之前的最大面積,更新最大面積
4)按要求輸入小數點后五位
 1 #include <iostream>
 2 #include <cmath>
 3 #include"iomanip"
 4  
 5 using namespace std;
 6  
 7 struct Point
 8 {
 9     char color;
10     int x;
11     int y;
12     int z;
13 };
14 //求三角形面積;
15 //返回-1為不能組成三角形;
16 double count_triangle_area(Point a,Point b,Point c){
17     double area = -1;
18  
19     double side[3];//存儲三條邊的長度;
20  
21     side[0] = sqrt(pow(a.x - b.x,2)+pow(a.y - b.y,2) + pow(a.z - b.z,2));
22     side[1] = sqrt(pow(a.x - c.x,2)+pow(a.y - c.y,2) + pow(a.z - c.z,2));
23     side[2] = sqrt(pow(c.x - b.x,2)+pow(c.y - b.y,2) + pow(c.z - b.z,2));
24  
25     //不能構成三角形;
26     if(side[0]+side[1]<=side[2] || side[0]+side[2]<=side[1] || side[1]+side[2]<=side[0]) return area;
27  
28     //利用海倫公式。s=sqr(p*(p-a)(p-b)(p-c));
29     double p = (side[0]+side[1]+side[2])/2; //半周長;
30     area = sqrt(p*(p-side[0])*(p-side[1])*(p-side[2]));
31  
32     return area;
33 }
34 int main()
35 {
36     int n;
37     while(cin>>n)
38     {
39         double area = 0.0;
40         double max_area = 0.0;
41         Point p[n];
42         for(int i=0;i<n;i++)
43         {
44             cin>>p[i].color>>p[i].x>>p[i].y>>p[i].z;
45         }
46         for(int i=0;i<n;i++)
47         {
48             for(int j=i+1;j<n;j++)
49             {
50                 for(int k=j+1;k<n;k++)
51                 {
52                     area = count_triangle_area(p[i],p[j],p[k]);
53                     if(((p[i].color == p[j].color) && (p[i].color == p[k].color))
54                         ||((p[i].color != p[j].color)&&(p[i].color != p[k].color)&&(p[j].color != p[k].color)))
55                     {
56                         max_area = max(max_area,area);
57                     }
58                 }
59             }
60         }
61         cout.setf(ios::fixed);//位數不夠自動補0(若需要自動補0,在cout之前進行補0的定義,cout中加入“<<fixed”)
62         cout << fixed <<setprecision(5)<<max_area<<endl;
63     }
64     return 0;
65 } 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM