题目描述 Description
给出一个简单多边形(没有缺口),它的边要么是垂直的,要么是水平的。要求计算多边形的面积。
多边形被放置在一个X-Y的卡笛尔平面上,它所有的边都平行于两条坐标轴之一。然后按逆时针方向给出各顶点的坐标值。所有的坐标值都是整数(因此多边形的面积也为整数)。
输入描述 Input Description
输入文件第一行给出多边形的顶点数n(n≤100)。接下来的几行每行给出多边形一个顶点的坐标值X和Y(都为整数并且用空格隔开)。顶点按逆时针方向逐个给出。并且多边形的每一个顶点的坐标值-200≤x,y≤200。多边形最后是靠从最后一个顶点到第一个顶点画一条边来封闭的。
输出描述 Output Description
输出文件仅有一行包含一个整数,表示多边形的面积。
样例输入 Sample Input
10
0 0
4 0
4 1
3 1
3 3
2 3
2 2
1 2
1 3
0 3
样例输出 Sample Output
9
Solve:
模板题,求一个非凸多边形的面积
Code:
1 #include <bits/stdc++.h> 2 using namespace std; 3 struct Node 4 { 5 int x , y; 6 Node(int _x = 0 , int _y = 0):x(_x) , y(_y){} 7 8 }; 9 10 int operator ^ (Node a , Node b) 11 { 12 return a.x * b.y - a.y * b.x; 13 } 14 Node operator - (Node a , Node b) 15 { 16 return Node(a.x - b.x , a.y - b.y); 17 } 18 int n; 19 vector<Node> data; 20 21 int PolyonArea() 22 { 23 int ret = 0; 24 for(int i = 1 ; i < n - 1 ; ++i) 25 ret += (data[i] - data[0]) ^ (data[i + 1] - data[0]); 26 return ret; 27 } 28 int main() 29 { 30 scanf("%d" , &n); 31 for(int i = 1 ; i <= n ; ++i) 32 { 33 Node a; 34 scanf("%d%d" , &a.x , &a.y); 35 data.push_back(a); 36 } 37 int sum = 0; 38 sum = PolyonArea() / 2; 39 40 printf("%d" , sum); 41 }
时间: 2024-10-10 01:52:21