书山有径勤为路>>>>>>>>

<<<<<<<<学海无涯苦作舟!

2011年11月15日

POJ 1113 凸包 graham

摘要: 题目:http://poj.org/problem?id=1113大意:求出凸包的周长,再加上一个圆的周长就是本问题的答案。这个问题没有任何的难度,直接采用现成的模板就可以了。View Code #include "iostream"#include "cstdio"#include "cmath"#include "algorithm"using namespace std;const double PI=acos(-1.0);const int size=1005;const double eps=1e-8;s 阅读全文

posted @ 2011-11-15 21:51 More study needed. 阅读(233) 评论(0) 推荐(0) 编辑

凸包3——Graham算法

摘要: Graham的扫描是一个很优美的过程 用到的数据结构也很简单 仅仅是一个栈而已核心的思想是按照排好的序 依次加入新点得到新的边如果和上一条边成左转关系就压栈继续如果右转就弹栈直到和栈顶两点的边成左转关系 压栈继续实现的时候我们不用存边 只需要含顺序在栈里存点 相邻两点就是一条边由于我们时时刻刻都保证栈内是一个凸壳所以最后扫描完毕 就得到了一个凸包下面还是继续上面的那个样例 演示一下栈扫描的过程这样Graham扫描算法基本完成复杂度是排序O(Nlog2N) 扫描O(N){每个点仅仅出入栈一次}合起来是一个O(Nlog2N)的算法 很优秀 阅读全文

posted @ 2011-11-15 20:53 More study needed. 阅读(301) 评论(0) 推荐(0) 编辑

凸包2——Graham算法

摘要: 1.点集排序为了得到加入新点的顺序 Graham扫描法的第一步是对点集排序排序是对杂乱的点集进行了梳理这也是这种算法能够得到更高效率的根本原因排序的方法也有两种极角坐标排序(极角序)和直角坐标排序(水平序)前者好理解一些 但是在实现的时候 后者更方便先说极角序 为了极角排序 我们先得得到一个参考点一般的 我们取最左边(横坐标最小)的点作为参考点如果有多个这样的点就取最下面的(纵坐标最小)看这样一个例子 这是一个任意给出的平面点集:参考点的定义:在横坐标最小的情况下取纵坐标最小的点所以所有的点只能在这个黄色的半平面中 而且正上方为闭(可取得) 正下方为开(不可取)这就决定了参考点的性质:点集中任 阅读全文

posted @ 2011-11-15 20:40 More study needed. 阅读(483) 评论(0) 推荐(0) 编辑

凸包1——卷包裹算法

摘要: 有了向量 我们就可以选取一个最外侧的点了利用向量 我们可以比较哪个点"更外侧"比如点K和点I 我们利用向量JK乘以向量JI得到一个数 这个数应该是负数 说明I比K更外侧两个向量的比较具有传递性所以我们可以像N个数里取最大的数一样取出最外侧的遍历所有点 每个点都和现有最外侧的点比较 得到新的最外侧的点至此两个问题都得以解决 我们可以写出满足一般要求的卷包裹算法了两个问题如下:1.怎么确定一个肯定在凸包上的点?这个问题很好解决 取一个最左边的也就是横坐标最小的点如果有多个这样的点 就取这些点里 纵坐标最小的这样可以很好的处理共线的情况2.如何确定下一个点(即最外侧的点)?我们需 阅读全文

posted @ 2011-11-15 20:23 More study needed. 阅读(424) 评论(0) 推荐(0) 编辑

叉乘(九)——点到线段的最近点

摘要: 计算点到线段的最近点: 如果该线段平行于X轴(Y轴),则过点point作该线段所在直线的垂线,垂足很容易求得,然后计算出垂足, 如果垂足在线段上则返回垂足,否则返回离垂足近的端点; 如果该线段不平行于X轴也不平行于Y轴,则斜率存在且不为0。 设线段的两端点为pt1和pt2,斜率为:k = ( pt2.y - pt1. y ) / (pt2.x - pt1.x ); 该直线方程为:y = k* ( x - pt1.x) + pt1.y。 其垂线的斜率为 - 1 / k,垂线方程为:y = (-1/k) * (x - point.x) + point.y 。 联立两直线方程解得:x ... 阅读全文

posted @ 2011-11-15 20:02 More study needed. 阅读(1053) 评论(0) 推荐(0) 编辑

叉乘(八)——拆线、多边形、矩形是否在多边形内?

摘要: 只要是了解了叉乘(七)里面的内容,这个就十分的简单了。 判断折线是否在多边形内:只要判断折线的每条线段是否都在多边形内即可。设折线有m条线段,多边形有n个顶点,则该算法的时间复杂度为O(m*n)。 判断多边形是否在多边形内:只要判断多边形的每条边是否都在多边形内即可。判断一个有m个顶点的多边形是否在一个有n个顶点的多边形内复杂度为O(m*n)。 判断矩形是否在多边形内:将矩形转化为多边形,然后再判断是否在多边形内。 阅读全文

posted @ 2011-11-15 19:44 More study needed. 阅读(384) 评论(0) 推荐(0) 编辑

叉乘(七)——线段是否在多边形内?

摘要: 判断线段是否在多边形内: 线段在多边形内的一个必要条件是线段的两个端点都在多边形内,但由于多边形可能为凹,所以这不能成为判断的充分条件。 如果线段和多边形的某条边内交(两线段内交是指两线段相交且交点不在两线段的端点), 因为多边形的边的左右两侧分属多边形内外不同部分,所以线段一定会有一部分在多边形外(见图a)。 于是我们得到线段在多边形内的第二个必要条件:线段和多边形的所有边都不内交。 线段和多边形交于线段的两端点并不会影响线段是否在多边形内; 但是如果多边形的某个顶点和线段相交,还必须判断两相邻交点之间的线段是否包含于多边形内部(反例见图b)。 因此我们可以先求出所有和线段相交... 阅读全文

posted @ 2011-11-15 19:35 More study needed. 阅读(1305) 评论(0) 推荐(1) 编辑

DP(二)——简单的01背包

摘要: 下面来看一个简单的01背包。题目:http://acm.swust.edu.cn/oj/problem/32/View Code #include "stdio.h"#include "string.h"#define size 1000int f[size];int max(int a, int b){ return a>b?a:b;}int main(){ int t, n; while(scanf("%d%d", &t, &n)==2) { int flag = 0, cw, i, v; memset(f, 阅读全文

posted @ 2011-11-15 09:38 More study needed. 阅读(445) 评论(0) 推荐(0) 编辑

导航

书山有径勤为路>>>>>>>>

<<<<<<<<学海无涯苦作舟!