题目链接:

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扫描算法相关推荐

  1. 二维凸包 Graham's Scan

    凸包是啥?? 凸包就是: 给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型,它能包含点集中所有的点. 外层的红线 就是凸包 一般题目会让你求利用最外层凸包的一些性质如下面这道题 来看一 ...

  2. POJ 3348 Cows(二维凸包)

    题目链接:https://cn.vjudge.net/problem/POJ-3348 题意:有一些数,坐标已知,要用这些树作为篱笆的顶点圈一块多边形的地养牛,每头牛占地大小50,问最多能养多少头牛. ...

  3. POJ4449(三维凸包+空间坐标旋转+二维凸包)

    题目:Building Design 题意: 题目就是给了一个凸多面题. 要把这个凸多面体放到地上,一个面要接触到地面. 求一种放法,使得最高点最高,最高点相同时使投影面积最小.输出最高点高度H和投影 ...

  4. 模板:二维凸包(计算几何)

    所谓凸包,就是一个凸出来的包 (逃) 前言 解析集合的第一课. 关键特征:周长最小.此时一定是凸包. 解析 定义 凸包:在平面上能包含所有给定点的最小凸多边形叫做凸包. 性质:凸包的周长是所有能包含给 ...

  5. 二维码的扫描与生成(含动态权限)

    首页 博客 学院 下载 GitChat TinyMind 论坛 问答 商城 VIP 活动 招聘 ITeye CSTO 写博客 发Chat cjm2484836553的博客 RSS订阅 原 Androi ...

  6. matlab 凹包,二维点集凹包算法介绍

    最近遇到一个求二维点集凹包的问题,凹包的叫法不知道是否准确,问题可以描述为:(原文下载在文章末尾) 在二维平面上有一系列的点,求能包围所有点集的二维多边形.(好像搜"离散点边界"或 ...

  7. 凸包Graham Scan算法实现

    凸包Graham Scan算法实现 凸包算法实现点集合中搜索凸包顶点的功能,可以处理共线情况,可以输出共线点也可以不输出而只输出凸包顶点.经典的Graham Scan算法,点排序使用极角排序方式,并对 ...

  8. C++旋转二维MxN矩阵的算法(附完整源码)

    C++旋转二维MxN矩阵的算法 C++旋转二维MxN矩阵的算法完整源码(定义,实现,main函数测试) C++旋转二维MxN矩阵的算法完整源码(定义,实现,main函数测试) #include < ...

  9. 关于二维码分块上色(彩色二维码)的算法研究

    原文:关于二维码分块上色(彩色二维码)的算法研究 众所周知,二维码通常是黑白的,而且是由若干个长方形或正方形小块平铺而成.但从人们的审美角度来看,常见的黑白二维码不免让人审美疲劳.本文试着从分块上色的 ...

  10. P2742 [USACO5.1]圈奶牛Fencing the Cows /【模板】二维凸包

    P2742 [USACO5.1]圈奶牛Fencing the Cows /[模板]二维凸包 题目: 给定一些点,问围住所有点所用的围栏的长度 题解: 凸包模板题 凸包详细 代码: #include&l ...

最新文章

  1. Airlaunch 快捷设置代码分享
  2. 曲线拟合最小二乘法C实现
  3. 为什么老编辑器Vim这么难用,却很受欢迎?
  4. 机房配电柜、机柜线缆施工标准做法及线缆入柜方式
  5. 使用diskpart命令修复U盘分区
  6. 运用El表达式截取字符串/获取list的长度
  7. 迈向现代化的 .Net 配置指北
  8. 记一次找因Redis使用不当导致应用卡死bug的过程
  9. 魔术方法 :__callStatic( )实例详解
  10. 接口测试——Jmeter直连数据库无法获取查找到的数据个数
  11. 使用TinyPng来压缩图片
  12. 修改typora主题的字体
  13. 《Sharding-JDBC》——数据库分表+数据库脱敏实现方案
  14. 计算机网络学习 - 网卡
  15. [杂题]「FJOI2018」所罗门王的宝藏
  16. Report WebCore crash to the ErrorReportUtils at:Fri Jul 24 09:59:08 格林尼治标准时间+0800 2015
  17. javascript常用工具类的封装
  18. Fairplay DRM与混淆实现的研究
  19. python编写hello程序_python第一个程序“Hello, world”
  20. VScode报错内容:Already included file name

热门文章

  1. mysql number decimal_Oracle中的decimal与Number区别
  2. Java常量不能二次赋值与常量不能修改值意思一样吗?
  3. java delete file 失败_文件无法删除java.io.IOException: Unable to delete
  4. python爬虫爬取网页图片_Python之多线程爬虫抓取网页图片
  5. CURL不能访问 但浏览器可以访问
  6. kubernetes视频教程笔记 (28)-集群调度-固定节点调度
  7. FISCO BCOS Solidity 使用Table合约CRUD接口 智能合约例子
  8. 无缝衔接的人会遭报应吗_王栎鑫回应新恋情,如何判断你的伴侣会不会无缝衔接...
  9. 门锁了开不了_送智能门锁丨选购时没有注意这些,着火时智能门锁可能会打不开?...
  10. mysql 视图没主键,mysql创建视图后打开提示没有主键,mysql视图