[編程題] 尋找三角形
時間限制: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 }
