随笔分类 - 计算几何
摘要:旋转卡壳可以用于求凸包的直径、宽度,两个不相交凸包间的最大距离和最小距离等。虽然算法的思想不难理解,但是实现起来真的很容易让人“卡壳”。拿凸包直径(也就是凸包上最远的两点的距离)为例,原始的算法是这样子: Compute the polygon's extreme points in theydirection. Call themyminandymax. Construct two horizontal lines of support throughyminandymax. Since this is already an anti-podal pair, compute the
阅读全文
摘要:http://poj.org/problem?id=2187题意:最长的点对近距离的平方:题解:旋转卡壳法, 要注意的地方是,有 所有点共线的情况,所以,(求凸包时)要将,共线点去出 ;1#include<cstdio>2#include<cstring>3#include<cmath>4#include<iostream>5#include<algorithm>6#include<set>7#include<map>8#include<queue>9#include<vector>10
阅读全文
摘要:http://poj.org/problem?id=1113题意:一个城墙 有n 个点描述, 国王想建一个周长最短的墙,使墙的任意一点到城墙的距离都 > L。求这面墙的周长。题解":最短周长 = 凸包周长 + 半径为 l 的圆的周长。还要注意的是这道题 不能 将共线点去掉1#include<cstdio>2#include<cstring>3#include<cmath>4#include<iostream>5#include<algorithm>6#include<set>7#include<map
阅读全文
摘要:http://poj.org/problem?id=1228题意:一块凸包的土地,有若干钉子钉在凸包的边上,现在其中一些钉子掉掉了,判断是否能根据剩下的钉子判断出原来这边凸包的土地,能输出“YES”,不能输出“NO”。题解“首先我们要知道 ,掉了的钉子只能是 边上的点 ,而不能是 拐点,所以我们要,先求其凸包(去除 共线的点),判断每条边上 是否 除了 拐点外 还有 其他的点 ,若没条边除了拐点外都还有其他的点 ,则输出 yes,否则输出 no; 1#include<cstdio>2#include<cstring>3#include<cmath>4#inc
阅读全文
摘要:题意:给出若干个点,求出它们的凸包,并且按原点为第一点的逆时针方向输出。输出为:(0,0)(-30,-40) (-30,-50) (-10,-60) (50,-60) (70,-50) (90,-20) (90,10) (80,20) (60,30)1#include<cstdio>2#include<cstring>3#include<cmath>4#include<iostream>5#include<algorithm>6#include<set>7#include<map>8#include<qu
阅读全文
摘要:http://poj.org/problem?id=1408题意:题意:有一个长 1 的正方形框(放在x-y坐标系的0-1上),然后给出一个数 n 代表该正方形每条边上的钉子数,接下来给出这钉子的坐标(按顺序且钉子没有重合的情况),把对边上的点依次按顺序用线连接起来,得到一张不规则的网,由多 个不过则四边形构成,输出这些小四边形中面积最大一块的面积。题解:首先将 四个边的点 保存, 根据题意 ,其中的四个点求出 点集p[][];然后 在枚举多有的 多边形 得到面积的最大值1#include<cstdio>2#include<cstring>3#include<cm
阅读全文
摘要:http://poj.org/problem?id=1696题意:题意:一张图上给出n个点的坐标(xi,yi),其中xi,yi均为正整数。记这n个点中,拥有最小y的点为A,你开始从点(0, yA)开始走向点A,然后,你可以随意选择径直走去另外的点,但必须满足一下3个条件: 1:只能向左转向(也可直走)。 2:走过的路径为留下一条红色的轨迹。 3:不能越过这条红色的轨迹。 问你最多能到达几个点,并且按到达的顺序输出各个点的标号。 题解:叉积 + dfs 易证:按照一定的顺序,每次选择当前左转角度最小的点(相等则选距离最近的点),必能按条件遍历所有的点。1#include<cstdio>
阅读全文
摘要:http://poj.org/problem?id=3304题意:求是否存在一条直线,使所有线段到这条直线的投影至少有一个交点。题解“:1:把问题转化为是否存在一条直线与每条线段都有交点。证明:若存在一条直线l和所有线段相交,作一条直线m和l垂直,则m就是题中要求的直线,所有线段投影的一个公共点即为垂足。所以我们只要枚举所有的端点构成的直线 ,就可以了,叉积 判断 是否直线和线段相交。2:枚举两两线段的各一个端点,连一条直线,再判断剩下的线段是否都和这条直线有交点。证明:若有l和所有线段相交,则可保持l和所有线段相交,上下 平移l到和某一线段交于端点停止(“移不动了”)。然后绕这个交点旋转。也
阅读全文
摘要:http://poj.org/problem?id=1039题意:已知电缆是由一段段直的管道连接而成的,并知道这些管道的位置,问一束光从最左边射进来,你可以调节光入射的位置和角度,问最远能射到多远。(光束不能射穿管道) 题解:枚举 : 一个最优的 直线 可能 和 管道没有交点,(但是 我们可以经过 平移,旋转 使其 与 管道 有 交点 这样的解 同样是最优 的,我们 枚举和 管道 有两个擦点的直线 (这样 才能 做这道题)) 枚举上下两个顶点成光线所在直线,然后判断光线是否能合法,合法的话求出它射到的最远距离。1#include<cstdio>2#include<cstrin
阅读全文
摘要:题意 :求一个三角形中的 整数 点有多少个?题接:Pick定理证明:http://translate.google.com/translate?u=http://episte.math.ntu.edu.tw/articles/sm/sm_25_10_1/page4.html&hl=zh-CN&ie=UTF8&sl=zh-TW&tl=zh-CN多边形的面积 (在网格 图中): pick 定理 s = b/2 + in - 1 (b 表示 边上的点 in 表示 内部的点)边上的点数 = gcd(|x1 - x2| ,|y1 - y2|);1#include<c
阅读全文
摘要:(更新中。。。。。。。) 点 结构structpoint{ double x;//或为double double y;}浮点处理:1intdbcmp(doublex)2{3if(fabs(x)<eps)return0;45if(x<0)return-1;6elsereturn1;7}点乘:intbetweencmp(pointc,pointa,pointb)//c是否在a,b间{returndbcmp(dot(c,a,b));}doubledotdet(doublex1,doubley1,doublex2,doubley2){returnx1*x2+y1*y2;}doubledot
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4353 题意: 给你n个点,m个雷 找一个多边形,使得多边形的面积除以这个多边形内雷的个数的比值最小 仔细想想,其实就是找一个比值最小的三角形就OK了,因为其他的三角形的比值都比它大,组合成多边形后势必会将比值变大 所以可以直接暴力O(n^3)枚举三角形,再计算三角形内的雷的个数求比值即可 雷得个数的话预处理一个数组吧,画张图就懂了 cnt= (i k上方的点 )- ( i j上方的点 + j k上方的点) 当然还要取绝对值1#include<cstdio>2#include<cstring
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4380题意: 给出 n个房子的位置 。和 m个 金矿的位置 ,从 n 个房子里选出三个(组成三角形),求出有多少种选法 是 三角形 内的金矿数为 奇数?题解:预处理 枚举 从 n 个房子里 选出 2个i,j 记录 在其上方的 金矿数dp[i][j],枚举所有的三角形 那么 三角形 内的点为 fabs(dp[i][k] - dp][i][j] - dp[j][k]);1#include<cstdio>2#include<cstring>3#include<cmath>4#in
阅读全文