随笔分类 - 计算几何
摘要:http://poj.org/problem?id=2954计算三角内部座标值为整数的点有多少个(不包括边上和顶点的点)。Pick公式的应用:Area=a/2+b-1;a为边界点,b为内部点。 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<cstdio> 4 #include<vector> 5 #include<cmath> 6 #include<algorithm> 7 using namespace std; 8 struct point 9 {10 int
阅读全文
摘要:http://poj.org/problem?id=2540在一个区间内寻找某一个点,每次走法会提示距目标是更近、更远还是相同。每次可确定一个目标必在的区域,求这个区域的面积。假定寻找者从A点走到B点,做线段AB的中垂线,取距目标近的那一半。用半平面交即可求该区域。注意Same时区域面积为0;若有出现面积为0,则之后的都是0; 1 #include <cmath> 2 #include <vector> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <cstring> 6 #i
阅读全文
摘要:http://poj.org/problem?id=1755有一个全能运动必有要求运动员完成游泳、骑自行车、跑步,三个项目。冠军为最快完成所有项目的运动员。已知每个运动员的三项速度分别为Vi, Ui, Wi 。裁判能够任意的设置三个项目的路程。问对某个运动员能否设定一个让他必羸的路程设置。当构造一个a,b,c的距离,使得t = a/u + b/v + c/w 时间最小,就可以了 那么就可以转化成 (1 / u1 - 1 / u2) * a + (1 / v1 - 1 / v2) * b + (1 / w1 - 1 / w2) * c < 0 ==> (1 / u1 - 1 / u2
阅读全文
摘要:http://poj.org/problem?id=3384给定一个多边形,在多边形内放有两个相同的圆,使两个圆尽可能多的覆盖多边形。输出最终两个圆心的位置。最优的放置方法必定是圆内切于两条边,那么把所有的边向内推移半径R的距离,得到新的多边形(也有可能是一个点或一条直线),求出新多边形相距最远的两个顶点,这两个顶点就是圆心的位置了。 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<iostream> 4 #include<cmath> 5 using namespace std; 6 co
阅读全文
摘要:http://poj.org/problem?id=3525求多边形最大内接圆半径。半平面交+二分查找:把多边形的每条边向内推R的距离,若变幻之后的仍是一个多边形,说明距离R太小了,若无边说明R过大。这边有两个纯几何上的问题,就是如果求直线和平移直线。一、已知两点求直线ax+by+c=0: 已知两点为A(x[i],y[i]),B(x[i+1],y[i+1]),取直线上的另外一点C(x,y),则有: (x-x[i])/(y-y[i])=(x[i+1]-x[i])/(y[i+1]-y[i]); 化解得: x(y[i+1]-y[i])+y(x[i]-x[i+1])+x[i+1...
阅读全文
摘要:http://poj.org/problem?id=1474和前面做过的两道一样,又是一题判断多边形是否存在核问题,照样粘贴模板。点是顺时针给出。 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 const double MAX =100000000; 7 const double pi =acos(-1.0); 8 const double eps=1e-8; 9 int m,s;1
阅读全文
摘要:http://poj.org/problem?id=3130和poj3335差不多的题目,都是判断多边形核是否存在问题,只不过这里的点是逆时针给出的,所以模板直接用。 1 #include<cmath> 2 #include<algorithm> 3 using namespace std; 4 5 const double MAX =100000000; 6 const double pi =acos(-1.0); 7 const double eps=1e-8; 8 int m,s; 9 struct node10 {11 double x,y; //注意类型12
阅读全文
摘要:http://poj.org/problem?id=3335给定一个多边形,判断是否存在核,点顺时针给出。半平面交模板直接用。 1 #include<cmath> 2 #include<algorithm> 3 using namespace std; 4 5 const double MAX =100000000; 6 const double pi =acos(-1.0); 7 const double eps=1e-8; 8 int m,s; 9 struct node10 {11 double x,y; //注意类型12 }tr[110],p[110],q[11
阅读全文
摘要:http://poj.org/problem?id=1654简单的多边形面积计算,用叉乘公式即可。c++提交 1 #include<stdio.h> 2 #include<stdlib.h> 3 int dir[10][2]={{0,0},{-1,-1},{0,-1},{1,-1},{-1,0},{0,0},{1,0},{-1,1},{0,1},{1,1}}; 4 int main() 5 { 6 int cas,i; 7 int x1,y1,x2,y2; 8 long long area; 9 char s[1000005];10 scanf("%d&quo
阅读全文
摘要:http://poj.org/problem?id=2074两条平行线段A,B,之间放有数条做为障碍物的线段,所有线段都平行,求B上能看到整个A的最长区间。求出各个障碍物所对应的不能看到整个A的区间,如上图所示区间[a,b]和区间[c,d],剩下的区间即为可看到整个A的区间,求出最长的就可以了。#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#include<iostream>#include<algorithm>#define ep
阅读全文
摘要:http://poj.org/problem?id=1584给一个多边形,和一个圆形的钉子,判断多边形是否为凸多边形,若为凸多边形判断钉子能否被包含在多边形内。判断是否为凸多边形:相邻的两条边做叉乘i*(i+1)都大于零(假定顶点为逆时针排序,顺时针反之)则为凸多边形。判断圆心是否在多边形内:设o为圆心,s1,s2为相邻顶点,若叉乘(s1s2)*(s1o)都大于零则圆心在多边形内部。(假定顶点为逆时针排序,顺时针反之)之后找圆心到多边形边的最短距离,若最短距离小于圆半径必定不会包含在多边形内。 1 #include<stdio.h> 2 #include<stdlib.h&g
阅读全文
摘要:http://poj.org/problem?id=3449在平面上给定一些几何图形,求任一个图形会和其它的哪些图形相交。本题并不难,线段相交判断即可。在求解正方形时,已知正方形的两个对角点(x0,y0),(x2,y2)时可由下面的方程求出(x1,y1),(x3,y3)。x1 + x3 = x0 + x2;x1 - x3 = y2 - y0;y1 + y3 = y0 + y2;y3 - y1 =x2 - x0;#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>
阅读全文
摘要:http://poj.org/problem?id=1039黑书P359例题题目要我们求出光线在Pipe里能射到的最远处的x坐标。我们只要找出其中一条最优光线。一条最优光线必须满足的一个必要条件是:它必定过Pipe的一个上顶点和一个下顶点。否则,我们总可以通过平移或是旋转使光线走更远的距离。有了这个条件,就可以通过枚举所有的上下顶点对(i,j),找出最优的。过上下顶点的光线共有n*n条,要求的就是Max{X(i,j) | 过上下顶点对(i,j)能达到的最远距离的横坐标} (i=0..n-1,j=0..n-1;)光线(i,j)要能进入了k-1到k这一节,则它比与(0,0)..(k-1,k-1)都
阅读全文
摘要:http://poj.org/problem?id=2826由两条线段组成的容器,最多能装多少的雨量,雨水垂直下落。下面三种情况是肯定不会积到雨的:1、两条线段没有交点;2、有一条水平;3、如图所示的情况(很容易被忽略):下面的代码G++一直WA,后来在discuss在看到提示,改为C++,居然AC了,汗。#include<stdio.h>#include<stdlib.h>#include<math.h>#include<iostream>#include<algorithm>#define eps 1e-9using namesp
阅读全文
摘要:http://poj.org/problem?id=1410 给定一个矩形和一条线段,求线段能否交矩形,线段与矩形的边或矩形内部有交点即为交。 很简单的一道判断线段相交的题目,不过要正确理解题目意思:相交要包括矩形的内部,即线段在矩形内部也是True。(The rectangle consists of four straight lines and the area in between.)题目说的左上、右下并非座标中的位置,数据给的点也会是左下、右上!!!(The terms top left and bottom right do not imply any ordering of co
阅读全文
摘要:http://poj.org/problem?id=1066 宝藏在一个矩形的内部,矩形内有纵横交错的墙形成多个房间,求最少炸掉多少道墙可到达宝藏所在的房间,宝藏不会在墙上,炸点必须在墙的中间点上,不会超过两个的墙相交以一点。 若起点和宝藏点连线的线段和某直线相交,那么无论你怎么绕你都要穿过这条直线才能到达宝藏点。所以我们可以这样做:枚举矩形边上的所有点做为起点,(不需要求中点做为起点)。连接起点、宝藏点,求出这条线段会和多少条其它的直线相交。然后加1(因为也要炸掉矩形边),即为所求答案。#include<stdio.h>#include<stdlib.h>#inclu
阅读全文
摘要:http://poj.org/problem?id=2653顺序的在地上扔一些细棒,求最后没有被压的细棒。我是用list容器存储,枚举过去,有被压的就删除,效率比较底,运行800多ms。#include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>#include<cmath>#include<list>using namespace std;struct point{double x,y;};struct line{point a,b;int
阅读全文
摘要:http://poj.org/problem?id=1556求点(0,5)到(10,5)的最短距离。图中任意两点(x座标不同)连线若没有与墙相交,则求出两点之间的距离加入最短路矩阵中,否则为无穷大。接下来用dijkstra法求最短路即可。本题主要建图比较繁琐一点。#include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>#include<cmath>using namespace std;struct point{double x,y;};struct
阅读全文
摘要:http://poj.org/problem?id=1269一、判断是否共线 相当于判断三点是否共线,叉积等0是即为共线。二、判断是否平行 设向量A=(a,b) 向量B=(c,d)若向量A与B平行则a/c=b/d;三、求交点这里也用到叉积的原理。假设交点为p0(x0,y0)。则有:(p1-p0)X(p2-p0)=0(p3-p0)X(p2-p0)=0展开后即是(y1-y2)x0+(x2-x1)y0+x1y2-x2y1=0(y3-y4)x0+(x4-x3)y0+x3y4-x4y3=0将x0,y0作为变量求解二元一次方程组。假设有二元一次方程组a1x+b1y+c1=0;a2x+b2y+c2=...
阅读全文
摘要:http://acm.uestc.edu.cn/problem.php?pid=1447给定一组点集,求至多选四点,使其所围成的面积最大。刚开始四重循环,直接超时掉。后来听说要用到旋转卡壳,且是在求三角形面积基础上求四边形面积的。在AC了一道旋转卡壳法求最大三角形面积后,终于把这道给A了。本题可以把四边形分为两个三角形的并,再用旋转卡壳法分别求出这两个三角形的最大面积。如下图所示,固定i,j点,分别找到这样的h,k点使三角形ijk和三角形ijh面积都最大。#include<stdio.h>#include<stdlib.h>#include<string.h>
阅读全文

浙公网安备 33010602011771号