poj1113Wall
来源:互联网 发布:ps3模拟器卡顿优化 编辑:程序博客网 时间:2024/05/16 17:25
http://poj.org/problem?id=1113
正好是凸包的周长加一圆周 套一下各种叉积、距离的模板就OK了。
要确定一个最低点作为凸包的起点 这个点一定得为凸包上的点 找最低的若有多个找最左的 然后Graham-Scan算法。
按极角排下序,其实就是按某点到起点形成的向量与另一点到起点形成的向量的左右关系 很明显 叉积判。
#include <iostream>#include<cstdio>#include<cstring>#include<stdlib.h>#include<math.h>#include<algorithm>#define PI 3.1415927using namespace std;typedef struct node{ double x,y;}Point;Point p[1100],stack[1100];int top;double xmult(Point a,Point b,Point c){ return (a.x-c.x)*(b.y-c.y) - (b.x-c.x)*(a.y-c.y);}double dis(Point a,Point b){ return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));}bool cmp(Point a,Point b){ double t = xmult(a,b,p[1]); if(t>0||(t==0&&dis(p[1],a)<dis(p[1],b))) return true; return false;}int main(){ int i,j,k,n,r; Point t; while(cin>>n>>r) { k = 1;top = 0; for(i = 1; i <= n; i++) { cin>>p[i].x>>p[i].y; if(p[i].y<p[k].y||(p[i].y==p[k].y&&p[i].x<p[k].x)) k = i; } if(k!=1) { t = p[1]; p[1] = p[k]; p[k] = t; } sort(p+2,p+n+1,cmp); stack[top++] = p[1]; stack[top++] = p[2]; stack[top++] = p[3]; for(i = 4; i <= n ; ) { if(top<2||xmult(stack[top-1],p[i],stack[top-2])>=0) { stack[top++] = p[i++]; } else top--; } stack[top] = p[1]; double s = 0; for(i = 0; i < top ; i++) { s+=dis(stack[i],stack[i+1]); } s+=PI*r*2; printf("%0.lf\n",s); } return 0;}
- poj1113Wall
- poj1113Wall
- poj1288poj1228Grandpa's Estate poj1113Wall
- poj1113Wall【凸包】
- POJ1113Wall(计算几何基础)
- 计算几何入门3--poj1113Wall
- poj1113Wall 求凸包周长 Graham扫描法
- poj1113Wall凸包入门题 模板
- poj1113Wall(凸包周长计算)
- POJ 3292 Semi-prime H-numbers
- python 学习笔记
- 教育豪赌让中国农村家庭不堪重负
- Delphi 编译错误信息表
- java设计模式——观察者模式
- poj1113Wall
- cookie无法设置除当前域名或者其父域名之外的其他domain.
- windbg+vmware调试驱动 x86 x64
- 与自己交谈,终不会寂寞
- mac os X下开启root用户
- TCP/IP工具和故障排除
- java基本数据类型
- [HNOI2012]三角形覆盖问题
- hdu 1395-2^x mod n = 1-易超时