http://poj.org/problem?id=1265
皮克定理:一个计算点阵中顶点在格点上的多边形面积公式:2S=2a+b-2,其中a表示多边形内部的点数,b表示多边形边界上的点数,s表示多边形的面积。
如图:
样例二视图。
计算多边形的面积:
此处不再证明。
多边形边上的点的个数(整数):(最大公约数)gcd(abs(dx), abs(dy));
通过皮克定理来计算多边形内部的点的个数。
注意:我在最后输出面积area时,使用了%.1lf,结果wa,使用%.1f,就能过,
不知道为什么,反正找这个地方,花了我很长时间。
代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
using namespace std;
int point[105][2];
int gcd(int a, int b) {
int temp;
while(b) {
temp = b;
b = a%b;
a = temp;
}
return a;
}
int Area(int x1, int y1, int x2, int y2) {
return x1 * y2 - x2 * y1;
}
int main() {
int i, t, m, dx, dy, inpoint, outpoint, count, area;
scanf("%d", &t);
count = t;
while(t--) {
scanf("%d", &m);
point[0][0] = 0;
point[0][1] = 0;
area = 0;
inpoint = 0;
outpoint = 0;
for(i = 1; i <= m; i++) {
scanf("%d%d", &dx, &dy);
outpoint += gcd(abs(dx), abs(dy));
point[i][0] = point[i-1][0] + dx;
point[i][1] = point[i-1][1] + dy;
area += Area(point[i-1][0], point[i-1][1], point[i][0], point[i][1]);
}
if(area < 0)
area = -area;
inpoint = (int)(area/2 - outpoint/2 + 1);
printf("Scenario #%d:\n", count - t);
printf("%d %d %.1f\n\n", inpoint, outpoint, (double(area)/2));
}
return 0;
}