二维凸包 Graham扫描算法
题目链接:
http://poj.org/problem?id=1113
求下列点的凸包
求得凸包如下:
Graham扫描算法:
找出最左下的点,设为一号点,将其它点对一号点连线,按照与x轴的夹角大小排序:
让点1,2入栈,从第三个点开始循环
步骤1:判断该点是否在栈顶第二个点和栈顶的点的连线的左边,
2.如果在左边,将该点入栈,继续循环,
3.如果不在,弹出栈顶点,重复步骤1,
3在1,2连线左边,3入栈
4在2,3连线左边,4入栈
5不在3,4连线左边,4出栈,5在2,3连线左边,5入栈
6在3,5连线左边,6入栈
7不在5,6连线左边,6出栈,7在3,5连线左边,7入栈
遍历完成后,将栈顶与1连起来就完成了
代码
//#include<bits/stdc++.h> #include<iostream> #include<cmath> #include<algorithm> #define fi first #define se second #define INF 0x3f3f3f3f #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) #define pqueue priority_queue #define NEW(a,b) memset(a,b,sizeof(a)) #define lowbit(x) ((x)&(-x)) using namespace std; const double pi=4.0*atan(1.0); const double e=exp(1.0); const int maxn=4e4+8; typedef long long LL; typedef unsigned long long ULL; const LL mod=1e9+7; const ULL base=1e7+7; struct Point{int x,y;bool operator<(Point &u){//坐标排序if(x!=u.x) return x<u.x;return y<u.y;} }; Point vex[maxn],Stack[maxn],Basis; short checkL(Point p,Point q,Point s){//判断点s是否在直线pq的左侧int area2=p.x*q.y-p.y*q.x+q.x*s.y-q.y*s.x+s.x*p.y-s.y*p.x;if(area2>0) return 1;//表示在左侧if(area2==0) return 0;//表示在同一条线上;return -1;//表示在右侧 } double dis(Point u,Point v){//计算uv的距离return sqrt((u.x-v.x)*(u.x-v.x)*1.0+(u.y-v.y)*(u.y-v.y)); } bool cmp(Point a,Point b){//极角排序short m=checkL(Basis,a,b);if(m==1) return 1;//b在基点与a的连线的左侧,说明b的极角大于aif(m==0&&dis(Basis,a)<=dis(Basis,b))//极角相同时,靠近基点的排在前return 1;return 0; } int main(){cin.tie(0);cout.tie(0);int n,l;cin>>n>>l;for(int i=0;i<n;i++){cin>>vex[i].x>>vex[i].y;}sort(vex,vex+n);Basis=vex[0];//选第一个点为基点sort(vex+1,vex+n,cmp);int top=0;Stack[top]=vex[0];Stack[++top]=vex[1];for(int i=2;i<n;i++){while(top>=1&&checkL(Stack[top-1],Stack[top],vex[i])<0){top--;}Stack[++top]=vex[i];}double sum=0.0;for(int i=0;i<top;i++){sum+=dis(Stack[i],Stack[i+1]);}sum+=dis(Stack[top],Stack[0]);sum+=2.0*pi*l;LL ans=(LL)sum;if(sum-(double)ans>=0.5){ans++;}cout<<ans<<endl;system("pause");return 0; }
转载于:https://www.cnblogs.com/Profish/p/9798675.html
二维凸包 Graham扫描算法相关推荐
- 二维凸包 Graham's Scan
凸包是啥?? 凸包就是: 给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型,它能包含点集中所有的点. 外层的红线 就是凸包 一般题目会让你求利用最外层凸包的一些性质如下面这道题 来看一 ...
- POJ 3348 Cows(二维凸包)
题目链接:https://cn.vjudge.net/problem/POJ-3348 题意:有一些数,坐标已知,要用这些树作为篱笆的顶点圈一块多边形的地养牛,每头牛占地大小50,问最多能养多少头牛. ...
- POJ4449(三维凸包+空间坐标旋转+二维凸包)
题目:Building Design 题意: 题目就是给了一个凸多面题. 要把这个凸多面体放到地上,一个面要接触到地面. 求一种放法,使得最高点最高,最高点相同时使投影面积最小.输出最高点高度H和投影 ...
- 模板:二维凸包(计算几何)
所谓凸包,就是一个凸出来的包 (逃) 前言 解析集合的第一课. 关键特征:周长最小.此时一定是凸包. 解析 定义 凸包:在平面上能包含所有给定点的最小凸多边形叫做凸包. 性质:凸包的周长是所有能包含给 ...
- 二维码的扫描与生成(含动态权限)
首页 博客 学院 下载 GitChat TinyMind 论坛 问答 商城 VIP 活动 招聘 ITeye CSTO 写博客 发Chat cjm2484836553的博客 RSS订阅 原 Androi ...
- matlab 凹包,二维点集凹包算法介绍
最近遇到一个求二维点集凹包的问题,凹包的叫法不知道是否准确,问题可以描述为:(原文下载在文章末尾) 在二维平面上有一系列的点,求能包围所有点集的二维多边形.(好像搜"离散点边界"或 ...
- 凸包Graham Scan算法实现
凸包Graham Scan算法实现 凸包算法实现点集合中搜索凸包顶点的功能,可以处理共线情况,可以输出共线点也可以不输出而只输出凸包顶点.经典的Graham Scan算法,点排序使用极角排序方式,并对 ...
- C++旋转二维MxN矩阵的算法(附完整源码)
C++旋转二维MxN矩阵的算法 C++旋转二维MxN矩阵的算法完整源码(定义,实现,main函数测试) C++旋转二维MxN矩阵的算法完整源码(定义,实现,main函数测试) #include < ...
- 关于二维码分块上色(彩色二维码)的算法研究
原文:关于二维码分块上色(彩色二维码)的算法研究 众所周知,二维码通常是黑白的,而且是由若干个长方形或正方形小块平铺而成.但从人们的审美角度来看,常见的黑白二维码不免让人审美疲劳.本文试着从分块上色的 ...
- P2742 [USACO5.1]圈奶牛Fencing the Cows /【模板】二维凸包
P2742 [USACO5.1]圈奶牛Fencing the Cows /[模板]二维凸包 题目: 给定一些点,问围住所有点所用的围栏的长度 题解: 凸包模板题 凸包详细 代码: #include&l ...
最新文章
- Airlaunch 快捷设置代码分享
- 曲线拟合最小二乘法C实现
- 为什么老编辑器Vim这么难用,却很受欢迎?
- 机房配电柜、机柜线缆施工标准做法及线缆入柜方式
- 使用diskpart命令修复U盘分区
- 运用El表达式截取字符串/获取list的长度
- 迈向现代化的 .Net 配置指北
- 记一次找因Redis使用不当导致应用卡死bug的过程
- 魔术方法 :__callStatic( )实例详解
- 接口测试——Jmeter直连数据库无法获取查找到的数据个数
- 使用TinyPng来压缩图片
- 修改typora主题的字体
- 《Sharding-JDBC》——数据库分表+数据库脱敏实现方案
- 计算机网络学习 - 网卡
- [杂题]「FJOI2018」所罗门王的宝藏
- Report WebCore crash to the ErrorReportUtils at:Fri Jul 24 09:59:08 格林尼治标准时间+0800 2015
- javascript常用工具类的封装
- Fairplay DRM与混淆实现的研究
- python编写hello程序_python第一个程序“Hello, world”
- VScode报错内容:Already included file name
热门文章
- mysql number decimal_Oracle中的decimal与Number区别
- Java常量不能二次赋值与常量不能修改值意思一样吗?
- java delete file 失败_文件无法删除java.io.IOException: Unable to delete
- python爬虫爬取网页图片_Python之多线程爬虫抓取网页图片
- CURL不能访问 但浏览器可以访问
- kubernetes视频教程笔记 (28)-集群调度-固定节点调度
- FISCO BCOS Solidity 使用Table合约CRUD接口 智能合约例子
- 无缝衔接的人会遭报应吗_王栎鑫回应新恋情,如何判断你的伴侣会不会无缝衔接...
- 门锁了开不了_送智能门锁丨选购时没有注意这些,着火时智能门锁可能会打不开?...
- mysql 视图没主键,mysql创建视图后打开提示没有主键,mysql视图