您的位置:首页 > 其它

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

2013-08-02 19:04 411 查看
下面是别人解题报告的链接,很详细,写的很好

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

下面贴我的代码

//求凸包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[330],convex[330];
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) <= 0)
return true;
else return false;
}
int main()
{
//    freopen("in.cpp","r",stdin);
int n;
while(scanf("%d",&n) ,n)
{
for(int i=0; i<n; ++i)
scanf("%d%d",&p[i].x,&p[i].y);
sort(p,p+n);
int m=0;
for(int i=0; i<n; ++i)
{
while(m > 1 && checkDir(convex[m-2],convex[m-1],p[i]) ) --m;
convex[m++] = p[i];
}
int k =m;
for(int i=n-2; i>=0; --i)
{
while(m > k && checkDir(convex[m-2],convex[m-1],p[i]) ) --m;
convex[m++] = p[i];
}
if(n >1) --m;
if(m == n) printf("convex\n");
else printf("concave\n");
}
return 0;
}


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

http://wenku.baidu.com/view/5bfee1dbd15abe23482f4d84.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: