Description:
在《驯龙高手2》故事的最后,邪恶势力的Alpha展开了对博克岛的攻势。在邪恶势力德雷格的指挥下,邪恶势力Alpha控制了没牙仔(小嗝嗝的爱宠),使其对小嗝嗝的父亲发生了攻击。
现在,身为年轻英勇的维京勇士小嗝嗝的你,为了解除Alpha对没牙仔的意念操控,需要解决如下问题。在没牙仔的视野里,有许多正多边形的障碍,只有清除了这些障碍,才能让没牙仔恢复正常。
为了清除这些障碍,你需要计算出所有多边形的面积之和。注意,每个多边形又在不同的平面内。为了简化问题,将给出在直角坐标系上描述的平面多边形。
(正五边形面积计算公式:S= 1.72048a^2,正七边形面积计算公式:S= 3.63391a^2,资料来自维基百科)
(double型变量,输入格式控制为%lf,输出格式控制为%f为标准)
Input:
有多组数据测试,以输入0结束。
对于每组输入数据,在第一行输入n,表示没牙仔的视野范中当前有n个多边形。接下来有n行。每一行中,首先输入一个数m,表示在这个平面中有m个点(3<= m < 9),接下来分别输入各个点在平面直角坐标系上x轴和y轴的坐标。
Output:
对于每组测试,输出“Case#k: ”,首先,k从1开始标号。 然后输出所有多边形的面积之和,并保留小数点后四位。
Sample Input:
3
4 0 0 1 0 1 1 0 1
3 0 1.73205 1 0 -1 0
8 0.5 0 1.207106 0.707106 1.207106 1.707106 0.5 2.414213 -0.5 2.414213 -1.207106 1.707106 -1.207106 0.707106 -0.5 0
0
Sample Output:
Case #1: 7.5605
#include <cmath>
#include "iostream"
#include "vector"
#include "iomanip"
using namespace std;
int main() {
int T;
//计数
int count = 1;
while (cin>>T) {
if (T==0){
break;
}
//最终加和
double s = 0;
//T组数据遍历
for (int i = 0; i < T; ++i) {
int n;
cin >> n;
//边长
double side;
//n个坐标点遍历存储
vector<vector<double>> length(n);
for (int j = 0; j < n; ++j) {
double a, b;
cin >> a >> b;
length[j].push_back(a);
length[j].push_back(b);
}
//边长
side = sqrt((length[1][0] - length[0][0]) * (length[1][0] - length[0][0]) +
(length[1][1] - length[0][1]) * (length[1][1] - length[0][1]));
//累加
switch (n) {
case 3:
s += 1.73205 / 4 * side * side;
break;
case 4:
s += side * side;
break;
case 5:
s += 1.72048 * side * side;
break;
case 6:
s += 1.73205 / 4 * side * side * 6;
break;
case 7:
s += 3.63391 * side * side;
break;
case 8:
s += 4.82843 * side * side;
break;
default:
break;
}
}
//格式输出
cout <<"Case #"<<count<<": "<<fixed<< setprecision(4)<<s << endl;
s = 0;
count++;
}
}