poj1654 - Area

                                    想看更多的解题报告: http://blog.csdn.net/wangjian8006/article/details/7870410
                                     转载请注明出处:
http://blog.csdn.net/wangjian8006

题目大意:一个坐标系,从原点开始走,然后1-4分别代表,向右下走,向右走,向右上走,向下走,5代表回到原点,6-9代表,向上走,向左下走,向左走,向左上走。(看翻译直接无限WA),给出一串包含1-9的字符串,问你这些点所围成的面积

根据面积公式,Area=1/2*abs((x0*y1-x1*y0)+(x1*y2-x2*y1)...+(xn*yn-1-xn-1*yn)+(xn*y0-x0*yn)) ,把相邻两点和原点组成一个三角形,而总面积是这n个三角形面积的和,而三角形面积是两个相邻边向量的叉积

#include <stdio.h> 
#include <string.h> 
#include <math.h> 
  
int dx[10]={0,1,1,1,0,0,0,-1,-1,-1}; 
int dy[10]={0,-1,0,1,-1,0,1,-1,0,1};
char s[1000010];
__int64 area,x,y,px,py;

int main(){
    int sum,t,tmp,i;
    scanf("%d",&tmp);
    while(tmp--){
        scanf("%s",s);
        t=strlen(s);
        if(t<3) {printf("0\n");continue;}
        area=0;
		x=y=0;
        for(i=0;i<t-1;i++){
            px=x+dx[s[i]-'0']; 
            py=y+dy[s[i]-'0']; 
            area+=(px*y-x*py);
			x=px;
			y=py;
        }
        if(area<0) area=(-1)*area; 
        if(area%2==0)
            printf("%I64d\n",area/2); 
        else printf("%I64d.5\n",area/2); 
    } 
    return 0; 
} 

你可能感兴趣的:(math.h)