链接: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了,求面积直接累加叉积的值,因为三角形的面积是有向的,最后再取绝对值。
究竟是我抛弃了历史,还是历史遗弃了我。
posted on
浙公网安备 33010602011771号