Pick 定理
Pick 定理¶
Pick 定理:给定顶点均为整点的简单多边形,皮克定理说明了其面积
具体证明:Pick's theorem
它有以下推广:
- 取格点的组成图形的面积为一单位。在平行四边形格点,皮克定理依然成立。套用于任意三角形格点,皮克定理则是
{\displaystyle A=2 \times i+b-2} - 对于非简单的多边形
{\displaystyle P} {\displaystyle A=i+{\frac {b}{2}}-\chi (P)} {\displaystyle \chi (P)} {\displaystyle P} - 高维推广:Ehrhart 多项式
- 皮克定理和 欧拉公式(
{\displaystyle V-E+F=2}
一道例题 (POJ 1265)¶
题目大意¶
在直角坐标系中,一个机器人从任意点出发进行
题解¶
这道题目其实用了以下三个知识:
- 以整点为顶点的线段,如果边
\textit{dx} \textit{dy} 0 \gcd(\textit{dx}, \textit{dy}) + 1 \gcd(\textit{dx},\textit{dy}) \textit{dx},\textit{dy} \textit{dx} \textit{dy} 0 \textit{dy} \textit{dx} - Pick 定理:平面上以整点为顶点的简单多边形的面积 = 边上的点数/2 + 内部的点数 + 1。
- 任意一个多边形的面积等于按顺序求相邻两个点与原点组成的向量的叉积之和(这个也可以通过顺时针定积分求得)。
参考代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
const int MAXN = 110;
struct node {
int x, y;
} p[MAXN];
inline int gcd(int x, int y) {
return y == 0 ? x : gcd(y, x % y);
} //求最大公约数
inline int area(int a, int b) {
return p[a].x * p[b].y - p[a].y * p[b].x;
} //求区域
int main() {
int t, ncase = 1;
scanf("%d", &t);
while (t--) {
int n, dx, dy, x, y, num = 0, sum = 0;
scanf("%d", &n);
p[0].x = 0, p[0].y = 0;
for (int i = 1; i <= n; i++) {
scanf("%d%d", &x, &y);
p[i].x = x + p[i - 1].x, p[i].y = y + p[i - 1].y;
dx = x, dy = y;
if (x < 0) dx = -x;
if (y < 0) dy = -y;
num += gcd(dx, dy);
sum += area(i - 1, i);
}
if (sum < 0) sum = -sum;
printf("Scenario #%d:\n", ncase++);
printf("%d %d %.1f\n\n", (sum - num + 2) >> 1, num, sum * 0.5);
}
return 0;
}
|
build本页面最近更新:,更新历史
edit发现错误?想一起完善? 在 GitHub 上编辑此页!
people本页面贡献者:OI-wiki
copyright本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用