編程練習:考古遺跡


 

受到新考古發現的影響,小賽最近迷上了考古,幫助考古學家根據已有的發現推測古時的一些建築結構設計。

最新某個區域中發現了古代祭祀場所的遺址,根據考古學者的研究,該遺址所在時代的祭祀場所通常設計為正多邊形,但場所的大小和多邊形角度因規模而異。多邊形的每個角上設置有一個柱子,柱子之間通過繩子連接。

新近出土的遺址由於受到破壞的原因,只發現了三個柱子,其余的柱子則湮滅在歷史的時間長河中。

根據已知的柱子坐標,考古學者請小賽幫忙計算祭祀場所可能的最小面積。

輸入

輸入的第一行為一個正整數T,表示有T組測試數據。每組測試數據有三行數據,每行為一個柱子的坐標,其絕對值不超過1000。坐標為浮點數表示,最多保留6位小數。

輸出

對每組測試數據,在單獨的一行里輸出可能的最小面積,請保留6位小數。已知正多邊形的角點數不超過100個。​

 

樣例輸入

1

0.000000 0.000000

1.000000 1.000000

0.000000 1.000000

 

 

樣例輸出

1.000000

我的解決方案如下,具體思路在注釋里有。

 

#include"stdafx.h" #include<stdio.h> #include<string.h> #include<assert.h> #include<math.h> #include<algorithm> #include<iostream> #pragma warning(disable:4996) using namespace std; void fre() //輸出重定向 { freopen("E:\\input.txt", "r", stdin); freopen("E:\\output.txt", "w", stdout); } double gcdx(double x, double y) //輾轉相除法求最大公約數,精度為0.001,這里的精度取決於題目中具體n最大是多少,一般去1/n比較合適 //因為弧度PI/n,精度滿足這個條件即可。  { while (fabs(x)>0.0001&&fabs(y)>0.0001) { if (x > y) { x = x - floor(x / y)*y; } else { y = y - floor(y / x)*x; } } return x + y; } double get_edge(double x1, double y1,double x2,double y2){ return sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2)); } int main() { double PI = 3.1415926; int T; double x1, y1, x2, y2, x3, y3; double a, b, c;//a,b,c 為三角形邊長; double A, B, C;//三角形角度的弧度值 double r, S;//r 為三角形外接圓半徑,S為三角形面積(用海倫公式求) double n;//正n邊形 double Sn;//正n邊形的面積 cin >> T; while(T>0){ cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3; a = get_edge(x1, y1, x2, y2); b = get_edge(x1, y1, x3, y3); c = get_edge(x2, y2, x3, y3); //三角形的角度公式cosA =(b2+c2-a2)/(2bc); A = acos((b*b + c*c - a*a) / (2 * b*c)); B = acos((a*a + c*c - b*b) / (2 * a*c)); C = acos((a*a + b*b - c*c) / (2 * a*b)); //求三角形的面積,用海倫公式求解面積 double p = (a + b + c) / 2; S = sqrt(p*(p - a)*(p - b)*(p - c)); r = a*b*c / 4 / S; double temp = gcdx(A, B); temp = gcdx(temp, C); //求多邊形有多少條邊,用360度除以每個圓心角的度數即可,而三角形對應的頂角是正多邊形圓周角, //根據圓周角定理,一條弧所對圓周角等於它所對圓心角的一半,所以這里用PI除以temp n = PI / temp; Sn = (r*r / 2)*sin(2 * PI / n)*n;//三角形面積公式1/2 absin(A),n個三角形 T = T - 1; printf("%.6f\n", Sn); } return 0; }
View Code


免責聲明!

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



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