[POJ2954&POJ1265]皮克定理的应用两例

皮克定理:

  在一个多边形中。用I表示多边形内部的点数,E来表示多边形边上的点数,S表示多边形的面积。

  满足:S:=I+E/2-1;

解决这一类题可能运用到的:

  求E,一条边(x1,y1,x2,y2)上的点数(包括两个顶点)=gcd(abs(x1-x2),abs(y1-y2))+1;

  求S:刚开始做POJ2954的时候莫名其妙一直WA,用了海伦公式求面积,后来又改用割补法,还是WA。发现面积还是用叉积算的好。

在八十中走廊里看过的书都忘光了啊...这么典型的叉积运用都会选择小学方法...不过至今没弄明白为什么海伦公式和割补法的误差那么大...



POJ2954 

 1 program poj2954;
 2 var x1,y1,x2,y2,x3,y3,e:longint;
 3       s:extended;
 4
 5 function gcd(x,y:longint):longint;
 6 begin
 7     if y=0 then exit(x) else
 8     exit(gcd(y,x mod y));
 9 end;
10
11 function calc_area(x1,y1,x2,y2,x3,y3:longint):extended;
12 begin
13     exit(abs((x2-x1)*(y3-y1)-(x3-x1)*(y2-y1))/2);
14 end;
15
16 function solve(x1,y1,x2,y2:longint):longint;
17 begin
18     exit(gcd(abs(x1-x2),abs(y1-y2))+1);
19 end;
20
21 begin
22     //assign(input,‘poj2954.in‘);reset(input);
23     //assign(output,‘a.out‘);rewrite(output);
24     while not eof do
25     begin
26         readln(x1,y1,x2,y2,x3,y3);
27         if (x1=0)and(y1=0)and(x2=0)and(y2=0)and(x3=0)and(y3=0) then halt;
28         s:=calc_area(x1,y1,x2,y2,x3,y3);
29         e:=solve(x1,y1,x2,y2)+solve(x1,y1,x3,y3)+solve(x2,y2,x3,y3)-3;
30         writeln(trunc(s-e/2+1));
31     end;
32 end.


POJ1265

 1 program poj1265;
 2 const maxn=110;
 3 type point=record x,y:longint;end;
 4 var t,test,n,e,i,tx,ty:longint;
 5       s:extended;
 6       a:array[-1..maxn]of point;
 7
 8 function gcd(x,y:longint):longint;
 9 begin
10     if y=0 then exit(x) else
11     exit(gcd(y,x mod y));
12 end;
13
14 function cross(p0,p1,p2:point):double;
15 begin
16     exit((p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y));
17 end;
18
19 begin
20     //assign(input,‘poj1265.in‘);reset(input);
21     readln(test);
22     for t:=1 to test do
23     begin
24         readln(n);
25         a[0].x:=0;a[0].y:=0;
26         for i:=1 to n do
27         begin
28             readln(tx,ty);
29             a[i].x:=a[i-1].x+tx;
30             a[i].y:=a[i-1].y+ty;
31         end;
32         e:=0;
33         for i:=0 to n-1 do inc(e,gcd(abs(a[i].x-a[i+1].x),abs(a[i].y-a[i+1].y)));
34         s:=0;
35         for i:=2 to n do s:=s+cross(a[0],a[i-1],a[i])/2;
36         s:=abs(s);
37         writeln(‘Scenario #‘,t,‘:‘);
38         writeln(trunc(s+1-e/2),‘ ‘,e,‘ ‘,s:0:1);
39         writeln;
40     end;
41 end.
时间: 2024-10-16 22:30:54

[POJ2954&POJ1265]皮克定理的应用两例的相关文章

poj1265&&2954 [皮克定理 格点多边形]【学习笔记】

Q:皮克定理这种一句话的东西为什么还要写学习笔记啊? A:多好玩啊... PS:除了蓝色字体之外都是废话啊...  Part I 1.顶点全在格点上的多边形叫做格点多边形(坐标全是整数) 2.维基百科 Given a simple polygon constructed on a grid of equal-distanced points (i.e., points with integer coordinates) such that all the polygon's vertices a

【模板】计几皮克定理 poj1265

题目链接:https://vjudge.net/problem/POJ-1265 题意:在整点网格中给你若干个点,输出围成的面积还有边上的点还有内部(不包括边的点). 这题为了普遍性做模板,所以就直接把所有点存下来了.皮克定理看注释吧 1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 const in

NOJ 1434 Fence (皮克定理)

Fence 时间限制(普通/Java):1000MS/3000MS         运行内存限制:65536KByte 总提交:59          测试通过:23 题目描述 In this problem, 'lattice points' in the plane are points with integer coordinates. In order to contain his cows, Farmer John constructs a triangular electric fe

Area---poj1265(皮克定理+多边形求面积)

题目链接:http://poj.org/problem?id=1265 题意是:有一个机器人在矩形网格中行走,起始点是(0,0),每次移动(dx,dy)的偏移量,已知,机器人走的图形是一个多边形,求这个机器人在网格中所走的面积,还有就是分别求多边形上和多边形内部有多少个网格点: 皮克定理: 在一个多边形中.用I表示多边形内部的点数,E来表示多边形边上的点数,S表示多边形的面积. 满足:S:=I+E/2-1; 求E,一条边(x1,y1,x2,y2)上的点数(包括两个顶点)=gcd(abs(x1-x

hdu 1705 Count the grid(皮克定理)

题目链接:hdu 1705 Count the grid 题意: 给定一个三角形三点坐标,问三角形内有多少个坐标均为整数的点. 题解: 给定顶点坐标均是整点(或正方形格点)的简单多边形,皮克定理说明了其面积 S 和内部格点数目 n.边上格点数目 s 的关系:S = n +s/2+1 三角形两向量叉积/2=面积. 向量上整数点数为gcd(v.x,v.y)(此公式对于一条边上的结果不准确,但是三条边加在一起的和是准确的) 1 #include<bits/stdc++.h> 2 #define F(

POJ 2954 Triangle (皮克定理, 三角形叉乘求面积)

Triangle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5303 Accepted: 2297 Description A lattice point is an ordered pair (x, y) where x and y are both integers. Given the coordinates of the vertices of a triangle (which happen to be lat

洛谷 P2735 电网 Electric Fences Label:计算几何--皮克定理

题目描述 在本题中,格点是指横纵坐标皆为整数的点. 为了圈养他的牛,农夫约翰(Farmer John)建造了一个三角形的电网.他从原点(0,0)牵出一根通电的电线,连接格点(n,m)(0<=n<32000,0<m<32000),再连接格点(p,0)(p>0),最后回到原点. 牛可以在不碰到电网的情况下被放到电网内部的每一个格点上(十分瘦的牛).如果一个格点碰到了电网,牛绝对不可以被放到该格点之上(或许Farmer John会有一些收获).那么有多少头牛可以被放到农夫约翰的电网

POJ 1265-Area(计算几何+皮克定理+多边形面积公式)

题目地址:POJ 1265 题意:给定一个格点多边形,求出内部点数in,边上点数on,和面积S. 思路:运用的定理很多. 1.皮克定理:S=in+on/2-1,即in=(2*S+2-on)/2. 2.多边形的面积公式:按顺序求相邻两个点与原点组成的向量的叉积之和. 3.求边上的格点数:以格子点为顶点的线段,覆盖的点的个数为GCD(dx,dy),其中,dxdy分别为线段横向占的点数和纵向占的点数.如果dx或dy为0,则覆盖的点数为dy或dx. #include <stdio.h> #includ

USACO 3.4 Electric Fence 皮克定理

题意:在方格纸上画出一个三角形,求三角形里面包含的格点的数目 因为其中一条边就是X轴,一开始想的是算出两条边对应的数学函数,然后枚举x坐标值求解.但其实不用那么麻烦. 皮克定理:给定顶点坐标均是整点(或正方形格点)的简单多边形,皮克定理说明了其面积A和内部格点数目i.边上格点数目b的关系:A = i + b/2 - 1. 有了这条定理就好办了. 三角形面积直接用公式就能算出来. 对于从点(0,0)到点(x,y)的线段,该线段上的格点数目即gcd(x,y)+1 这样A和b都有了,套公式就行了.