HDu 2036(多角形の面積を計算)

1591 ワード

Input
入力データには複数のテストインスタンスが含まれており、各テストインスタンスは1行を占め、各行の最初は整数n(3<=n<=100)であり、多角形の辺数(もちろん頂点数)を表し、次いで反時計回りの順序で与えられたn個の頂点の座標(x 1,y 1,x 2,y 2...xn,yn)であり、問題を簡略化するために、ここでのすべての座標は整数で表される.
入力データのすべての整数は32ビット整数の範囲内であり、n=0はデータの終了を示し、処理しない.
 
Output
各テストインスタンスについて、対応するポリゴン面積を出力し、小数点以下の小数点まで正確にします.
各インスタンスの出力は1行を占めます.
 
Sample Input

   
   
   
   
3 0 0 1 0 0 1 4 1 0 0 1 -1 0 0 -1 0

 
Sample Output

   
   
   
   
0.5 2.0

テンプレート~
#include <stdio.h>
#include <string.h>

struct Point
{
    double x, y;
    Point(double x=0, double y=0):x(x), y(y) {}
};
typedef Point Vector;
Point xy[110];
// A B 。
double Cross(Vector A, Vector B) {return A.x*B.y - A.y*B.x; }
//  -   =  
Vector operator - (Point A, Point B) {return Vector(A.x-B.x, A.y-B.y); }
// 
double PloygonArea(Point* p, int n)
{
    double  area = 0;
    for(int i=1; i<n-1; i++)
        area  += Cross(p[i]-p[0], p[i+1] - p[0]);
    return area / 2;
}

int main()
{
    int n, i;
    while(scanf("%d",&n),n)
    {
        for(i=0; i<n; i++)
            scanf("%lf%lf",&xy[i].x,&xy[i].y);
        double sum = PloygonArea(xy,n);
        printf("%.1lf
",sum); } return 0; }