![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
POJ题目简单计算几何
文章平均质量分 53
hot_wolf
这个作者很懒,什么都没留下…
展开
-
POJ 1654 Area
这是一道非常好的计算多边形面积的题目,首先多边形不确定凹凸,其次多边形的点很多,所以这道题就不能用我们平常的想法去根据点计算多边形的面积。通过观察可以发现这道题有一个比较好的地方,那就是多边形的边已经按次序给出,并且保证没有任何相邻的两点和别的边构成相交的情况,而且最终一定会走回原点构成多边形,所以可以根据叉积的性质去求。 |a×b|=|a|*|b|*sinθ,将叉积除以2正原创 2012-07-19 22:33:31 · 255 阅读 · 0 评论 -
poj 3449 Geometric Shapes
这是一道没有多少人做的水题,主要题目的要求比较多,对输入和输出的要求高,只要处理好输入输出,然后对每个多边形的每条边分别进行判断就能做出来了。#include#include#include#includeusing namespace std;int ch[26];struct point{ double x,y;};point polygon[26][22];doubl原创 2013-02-25 18:20:10 · 274 阅读 · 0 评论 -
POJ 1113 Wall
最基础的凸包题,可以用来测模板。凸包就是给定一些点,求包括这些点的边长最小的多边形,常用的有graham算法和melkman算法。graham算法是先按y坐标再按x坐标排序,由凸包的性质可以发现最下面最左边的点一定是凸包上的点,然后按顺序扫直到有一个点不满足与当前栈顶两点的左旋性质,然后退栈,直到他满足左旋或者堆栈里面还有一个元素,将它加入堆栈,先从前往后遍历,再从后往前遍历,这样原创 2012-07-22 19:43:14 · 261 阅读 · 0 评论 -
POJ 1696 Space Ant
简单题,题意就是从y坐标最低的点出发,每次只能向左转,并且不能与之前走过的路相交,问最多能经过多少个点。 这其实就是一个对每个点,找求最小极角的问题首先判断当前的角与堆栈顶部的两个角的夹角是否成左旋,然后找与当前栈顶的点构成的直线角度最小的点入栈,然后重复上面的步骤,直到没有满足条件的点为止。代码如下:#include#include#include#includeusing na原创 2012-07-22 16:54:20 · 319 阅读 · 0 评论 -
Poj 1265 Area
和POJ 1654类似,利用格点的性质和给的点的连续性即可。多边形的面积:首先多边形不确定凹凸,其次多边形的点很多,所以这道题就不能用我们平常的想法去根据点计算多边形的面积。通过观察可以发现这道题有一个比较好的地方,那就是多边形的边已经按次序给出,并且保证没有任何相邻的两点和别的边构成相交的情况,而且最终一定会走回原点构成多边形,所以可以根据叉积的性质去求。|a×b|=|a|*|b|*sinθ原创 2012-07-21 20:13:31 · 332 阅读 · 0 评论 -
POJ 2194 2850 Stacking Cylinders
很简单,直接用高中的解析几何知识,将两个与两个圆都想切的圆的圆心求出来就可以了,在加个两重循环找到最上面的点。#include #include #includeusing namespace std;double num[20][20], numy[20][20];int n;void getpoint( double x1, double y1, double x2, do原创 2012-07-22 14:52:48 · 704 阅读 · 0 评论 -
POJ 2653 Pick-up sticks
简单的判断线段相交问题,用滚动数组记录最上面的线段,如果与当前的线段相交则抛弃,否则加入滚动数组。#include#includeusing namespace std;double eps=1e-6;int n;struct Point{ double x,y;};struct Line{ Point s,e;};int que[2][100005];int top[原创 2012-07-22 14:25:02 · 250 阅读 · 0 评论 -
POJ 1269 Intersecting Lines
非常基础的判断直线关系题,用最直观的方式:写出直线的一般式,然后根据高中的解析几何判断两条直线是否相交,相同和平行。#includedouble eps=1e-6;double abs(double a){ if(a<0) return -a; return a;}struct Point{ double x,y;};struct line{ double a,b,c原创 2012-07-21 21:44:05 · 220 阅读 · 0 评论 -
Poj 2074 Line of Sight
这题确实是道水题,第一,思路并不难想,就是根据房子的右端点和障碍物的左端点判断最左边能看到房子全貌的点,再根据房子的左端点和障碍物的右端点判断最右边能看到房子全貌的点,把这些点记录下来再扫描判重,根据每一个右端点,找到一个在他右边离他最近的左端点与他的距离,如果有线段覆盖这个右端点,那么该右端点就不能在某个可视区域里面,长度为零(记得将线段的左右端点加入数组中判断!)要注意障碍物不在两条线段之原创 2012-07-21 17:35:11 · 589 阅读 · 0 评论 -
POJ 1835 宇航员
题意是一个可以在三维空间任意行走的宇航员,告诉你他每次行走的方向,让求最后到达的地点和面对的方向。这题看上去比较简单,但仔细想想,其实就算是朝一个方向走也有4种不同的方式,所以很容易想到不仅记录前进的方向还要记录头所朝的方向,然后根据转弯判断之后的方向。#include#includechar tmp[20];void next(int flag,int dir[],int head[]原创 2012-07-22 20:16:09 · 330 阅读 · 0 评论 -
POJ 1410 Intersection
思路:先判断是否在矩形内部,再判断线段是否能和矩形的某条边相交,若满足其中一个条件则为真,否则为假。discuss中有人说给的点不是按左上和右下的顺序,如果对每条边都判断的话就不用考虑左上角或者右下角了,代码如下:#include#includeusing namespace std;struct Point{ int x,y;};int Mul(Point p1,Point原创 2012-07-22 15:18:47 · 223 阅读 · 0 评论 -
POJ 3304 Segments
题目大意是给一些线段,判断是否存在一条直线使得这条直线与所有的线段都有交点。 对于这个题我有两个思路,第一是从无穷远处引一条射线,通过不断地旋转这条射线也就是枚举所有的线段的两个端点,让他们构成一条直线,然后看这条直线能否和所有的点相交。(没有去做,也不知道是否正确) 另一个思路就是从所有的点中每次枚举两个不相同的点,看他们构成的直线能否与所有的原创 2012-07-21 22:14:22 · 338 阅读 · 0 评论 -
POJ 1434 Fill the Cisterns
简单的二分,先判断给的水是否超过所有的盒子的容量,然后对最高的盒子的上界和最低的盒子的下界进行二分,直到h-l满足给定的条件跳出,只需要再加一个中间状态算总的水的体积的函数即可,代码如下:includedouble eps=0.000001;int v,hmax,hmin;int n;struct box{ int b,h,w,d;}c[51000];double vol(dou原创 2012-07-22 15:38:45 · 354 阅读 · 0 评论 -
POJ 1106 Transmitters
这是道计算几何的简单题,只要以每一个与圆心距离小于等于圆半径的点和圆心构成半圆的直径线,然后找在直径右侧且距圆心距离小于等于圆的半径的点的个数,记录最大值就行了。#include#includedouble eps=1e-8;double abs(double a) //绝对值{ if(a<0) return -a; return a;}struct Point{原创 2012-07-21 20:55:25 · 281 阅读 · 0 评论 -
poj 1379 Run Away
题意就是寻找最安全的点,也就是找到一点使得他在题目给的区域之内与所有点最短距离最大,很容易想到这题可以用不断趋近的模拟退火来做,先随机一部分点集,对每个点分别点的扩展,选取较优点来替代原来的点,然后不断缩小步长,点的扩展时试了几种方法,发现还是使用正余弦比较靠谱。#include#include#include#include#include#includeusing namesp原创 2013-02-27 15:28:41 · 713 阅读 · 2 评论