下面是别人解题报告的链接,很详细,写的很好

http://blog.csdn.net/chl_3205/article/details/8520597

下面贴我的代码

 #include <cstdio>
struct point
{
int x,y;
} p[];
bool checkDir(point p0,point p1,point p2)
{
if((p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y) * (p2.x-p0.x) > )
return true;
else return false;
}
int main()
{
// freopen("in.cpp","r",stdin);
int n;
while(scanf("%d",&n),n)
{
for(int i=; i<n; ++i)
scanf("%d%d",&p[i].x,&p[i].y);
bool flag = true;
bool cur = checkDir(p[],p[],p[]);
for(int i=; i<n; ++i)
{
bool f = checkDir(p[i],p[(i+)%n],p[(i+)%n]);
if(f != cur)
{
flag = false;
break;
}
}
if(flag ) printf("convex\n");
else printf("concave\n");
}
return ;
}

虽然这是一个水题,但是其中的思想与Andrew算法求凸包的思想是一样的。。。。

Andrew算法求凸包的思想大概是:先将所有点按坐标x从小到大排序,x相同按y从小到大排序。

然后按排好顺序的序列顺序前进,是往左走的就加入凸包,出现往右走的就回溯剔除点,直到往左走。这样求出下半个凸包。

再逆序前进一遍,同理,求出上半个凸包。刘汝佳的白书中有介绍。

下面的代码本质上是在求凸包,但是也可以用来判断该多边形是否为凸多边形。同时不要求点是按逆时针顺序给出的。

 //求凸包Andrew扫描算法,复杂度主要为排序O(n*logn),扫描为O(n)
#include <cstdio>
#include <algorithm>
#define INF 0x7fffffff
using namespace std;
struct point
{
int x,y;
bool operator <(const point & other) const
{
if(x < other.x)
return true;
if(x == other.x && y < other.y)
return true;
return false;
};
} p[],convex[];
bool checkDir(point p0,point p1,point p2)
{
if((p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y) * (p2.x-p0.x) <= )
return true;
else return false;
}
int main()
{
// freopen("in.cpp","r",stdin);
int n;
while(scanf("%d",&n) ,n)
{
for(int i=; i<n; ++i)
scanf("%d%d",&p[i].x,&p[i].y);
sort(p,p+n);
int m=;
for(int i=; i<n; ++i)
{
while(m > && checkDir(convex[m-],convex[m-],p[i]) ) --m;
convex[m++] = p[i];
}
int k =m;
for(int i=n-; i>=; --i)
{
while(m > k && checkDir(convex[m-],convex[m-],p[i]) ) --m;
convex[m++] = p[i];
}
if(n >) --m;
if(m == n) printf("convex\n");
else printf("concave\n");
}
return ;
}

求凸包有很多算法吧,应该,下面是详细介绍一种貌似叫Graham算法求凸包,但是该算法数值稳定性没有Andrew算法好,它还要求角的余弦值,排序。

http://wenku.baidu.com/view/5bfee1dbd15abe23482f4d84.html

HDU 2108 逆时针给出多边形的顶点,判断是否为凸多边形,水题的更多相关文章

  1. HDU 1086 You can Solve a Geometry Problem too( 判断线段是否相交 水题 )

    链接:传送门 题意:给出 n 个线段找到交点个数 思路:数据量小,直接暴力判断所有线段是否相交 /*************************************************** ...

  2. HDU 1040 As Easy As A+B (排序。。。水题)

    题意:给定n个数,让你从小到大排序. 析:不说什么了. 代码如下: #include <cstdio> #include <iostream> #include <cst ...

  3. hdu 2108 Shape of HDU【判断多边形是否是凸多边形模板】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=2108 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  4. hdu 2108:Shape of HDU(计算几何,判断多边形是否是凸多边形,水题)

    Shape of HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  5. *HDU 2108 计算几何

    Shape of HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  6. hdu 2108 Shape of HDU 判断是否为凸多边形

    Shape of HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Pro ...

  7. hdu 2108 Shape of HDU (数学)

    Shape of HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  8. HDU 2108 Shape of HDU (判断是不是凸多边形 叉乘)

    Shape of HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  9. hrbustoj 1306:再遇攻击(计算几何,判断点是否在多边形内,水题)

    再遇攻击 Time Limit: 1000 MS    Memory Limit: 65536 K Total Submit: 253(37 users)   Total Accepted: 56(2 ...

随机推荐

  1. Shell循环输入符合条件为止

    提供用户输入,直到输入d/D/r/R为止. #!/bin/bash ]; do echo -n "(D)ebug or (R)elease?" read select_build_ ...

  2. Python mysql-常用对象

    2017-09-08 13:14:14 db = pymysql.connect(host,user,passwaord,db,chartset),charset=utf8,可以避免中文的乱码 con ...

  3. 探索Bioconductor数据包

    参考: R的bioconductor包TxDb.Hsapiens.UCSC.hg19.knownGene详解 Bioconductor的数据包library(org.Hs.eg.db)简介

  4. Style样式的四种使用(包括用C#代码动态加载资源文件并设置样式)

    Posted on 2012-03-23 11:21 祥叔 阅读(2886) 评论(6) 编辑 收藏 在Web开发中,我们通过CSS来控制页面元素的样式,一般常用三种方式: 1.       内联样式 ...

  5. 20170112xlVBA查询SQL

    Sub NextSeven_CodeFrame() '应用程序设置 Application.ScreenUpdating = False Application.DisplayAlerts = Fal ...

  6. android--------ExpandableListView的使用多级列表

    多级列表ExpandableListView 扩展列表能够显示一个指示在每项显示项的当前状态(状态通常是一个扩展的组,组的孩子,或倒塌,最后一个孩子).使用setchildindicator(draw ...

  7. Python装饰器、生成器、内置函数、json

    这周学习了装饰器和生成器,写下博客,记录一下装饰器和生成器相关的内容. 一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如 ...

  8. ubuntu 用户和root权限转换

    1,用户权限要转换为root 输入:sudo su   或者sudo -i  然后按照提示输入相应的密码你就可以转化为root用户了. 2,root权限切换成用户权限 输入:su  如果是服务器那就输 ...

  9. nyoj-833-博弈

    833-取石子(七) 内存限制:64MB 时间限制:1000ms 特判: No通过数:16 提交数:30 难度:1 题目描述: Yougth和Hrdv玩一个游戏,拿出n个石子摆成一圈,Yougth和H ...

  10. HDU-3480 Division (四边形不等式优化DP)

    题目大意:将n个数分成m组,将每组的最大值与最小值的平方差加起来,求最小和. 题目分析:先对数排序.定义状态dp(i,j)表示前 j 个数分成 i 组得到的最小和,则状态转移方程为dp(i,j)=mi ...