链接:http://poj.org/problem?id=1654
题意:求多边形面积。
思路:题目较为简单,得到多边形的顶点,然后求面积。
#include<cstdio> #include<cmath> #include<cstring> using namespace std; const int maxn=1000000+5; char s[maxn]; struct Point { int x,y; }p[maxn]; int Cross(Point a,Point b) { return a.x*b.y-b.x*a.y; } int main() { int t,len; long long area; scanf("%d",&t); while(t--) { scanf("%s",s); len=strlen(s); area=0; p[0].x=0;p[0].y=0; p[len].x=0;p[len].y=0; for(int i=0;i<len;i++) { switch(s[i]) { case '6': p[i+1].x=p[i].x+1;p[i+1].y=p[i].y;break; case '4': p[i+1].x=p[i].x-1;p[i+1].y=p[i].y;break; case '2': p[i+1].y=p[i].y-1;p[i+1].x=p[i].x;break; case '8': p[i+1].x=p[i].x;p[i+1].y=p[i].y+1;break; case '1': p[i+1].x=p[i].x-1;p[i+1].y=p[i].y-1;break; case '3': p[i+1].x=p[i].x+1;p[i+1].y=p[i].y-1;break; case '9': p[i+1].x=p[i].x+1;p[i+1].y=p[i].y+1;break; case '7': p[i+1].x=p[i].x-1;p[i+1].y=p[i].y+1;break; } area+=Cross(p[i],p[i+1]); } if(area<0) area=-area; if(area%2==0) printf("%I64d\n",area/2); else printf("%I64d.5\n",area/2); } return 0; }
由于最后结果只可能是整数或者 .5 所以用area用整形处理,另外,在结果中可能会超过int,所以要用long long。
在计算过程中,一开始每次求叉积我都算的是叉积的绝对值,自然wa了,求面积直接累加叉积的值,因为三角形的面积是有向的,最后再取绝对值。
究竟是我抛弃了历史,还是历史遗弃了我。