http://poj.org/problem?id=1265
Pick定理:一个计算点阵中顶点在格点上的多边形面积公式:S=a+b÷2-1,其中a表示多边形内部的点数,b表示多边形边界上的点数,s表示多边形的面积。
如图:
图中是样例二。题目要求输出边界格点个数、内部格点个数、其面积。已知一条直线,如图中(5,0)到(6,3)这条直线,经过的整点数是2,可通过如下公式计算:
格点数 = gcd(abs(x2-x1),abs(y2-y1))
前提,约定起点不算在该线所经过格点数中。
至此,有如下代码:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
struct point
{
int x, y;
};
int gcd(int v1, int v2)
{
while (v2)
{
int temp = v2;
v2 = v1 % v2;
v1 = temp;
}
return v1;
}
int crossproduct(point a, point b)
{
return a.x * b.y - a.y * b.x;
}
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
int t;
cin >> t;
point p[105];
int Edgepoint = 0;
int Innerpoint = 0;
int Area = 0;
p[0].x = 0, p[0].y = 0;
for (int j = 1; j <= t; j++)
{
point temp;
cin >> temp.x >> temp.y;
p[j].x = p[j - 1].x + temp.x;
p[j].y = p[j - 1].y + temp.y;
Edgepoint += gcd(abs(temp.x), abs(temp.y));
Area += crossproduct(p[j - 1], p[j]);
}
if (Area < 0) Area = -Area;
Innerpoint =(int)( Area / 2 - Edgepoint / 2 + 1 );
printf("Scenario #%d:\n%d %d %.1f\n\n", i, Innerpoint, Edgepoint, (double(Area) / 2));
}
}