POJ 1654(计算几何基础多边形面积)

时间:2023-01-08 11:12:00

题意:给你一串数字,每个数字分别代表不同的方向,一定是在1x1的格子中走动,问最后围成的多边形面积是多少


题解:将整个多边形划分,
ans = (∑相邻两个点分别与原点构成的线段的叉积 )/ 2
由叉积的几何意义可知求得的结果是一个平行四边形的面积


#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
#include <map>
#include <cmath>
#include <queue>
#include <set>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 1e6 + 5;
typedef long long LL;
int dx[] = {0,-1,0,1,-1,0,1,-1,0,1};
int dy[] = {0,-1,-1,-1,0,0,0,1,1,1};
struct Point{
    int x,y;
    Point(){}
    Point(int xx, int yy):x(xx),y(yy){}
};
LL cross(Point a, Point b, Point c){
    return (c.x-a.x)*(c.y-b.y)-(c.x-b.x)*(c.y-a.y);
}
int main(){
    int n;
    char s[maxn];
    scanf("%d",&n);
    while(n--){
        scanf("%s",s);
        int len = (int)strlen(s);
        Point a(0,0);
        Point dot(0,0);
        LL ans = 0;
        for(int i=0; i<len; i++){
            Point b(a.x+dx[s[i]-'0'],a.y+dy[s[i]-'0']);
            ans += cross(a,b,dot);
            a = b;
        }
        if(ans < 0) ans = -ans;
        printf("%lld",ans/2);
        if(ans % 2 == 1) printf(".5");
        printf("\n");
    }
}