POJ 1654 Area 多边形面积 三角形面积等于两边的向量的叉积的1/2

问题描述: 多边形面积问题(1-9表示各个方向)

    North    
  7 8 9  
West 4 5 6 East
  1 2 3  
    South    

 

思路:将多边形两两相邻的点与原点相连组成多个三角形然后求三角形面积

三角形面积等于两边的向量的叉积 :

  设边向量 A(x1, y1)  B(x2, y2)

  则面积Area = 1/2(x1*y2 - y1*y2)

 

11068134 NY_lv10 1654 Accepted 940K 32MS C++ 861B 2012-12-01 14:14:38

 

View Code
 1 /*根据面积公式,Area=1/2*abs((x0*y1-x1*y0)+(x1*y2-x2*y1)...+(xn*yn-1-xn-1*yn)+(xn*y0-x0*yn)) 

 2 把相邻两点和原点组成一个三角形,而总面积是这n个三角形面积的和,而三角形面积是两个相邻边向量的叉积*/

 3 

 4 

 5 #include <iostream>

 6 

 7 using namespace std;

 8 

 9 int dx[] = {0, -1, 0, 1, -1, 0, 1, -1, 0, 1};

10 int dy[] = {0, 1, 1, 1, 0, 0, 0, -1, -1, -1};

11 

12 __int64 area;

13 char cstr[1000005];

14 

15 int main()

16 {

17     int t;

18     string str;

19     int x, y, tx, ty;

20     int i;

21     scanf("%d", &t);

22     while (t--)

23     {

24         scanf("%s", &cstr);

25         int len = strlen(cstr); 

26         if (len < 3)

27         {

28             printf("0\n");

29             continue;

30         }

31         x = y = 0;

32         area = 0;

33 

34         for (i = 0; i < len-1; i++)

35         {

36             tx = x + dx[cstr[i]-'0'];

37             ty = y + dy[cstr[i]-'0'];

38             area += tx*y - ty*x;

39             x = tx;

40             y = ty;

41         }

42         if (area < 0) area = -area;

43         if (area % 2 == 0)

44             printf("%I64d\n",area/2); 

45         else

46             printf("%I64d.5\n",area/2); 

47     }

48     return 0;

49 }

 

你可能感兴趣的:(poj)